算法入门2(c语言)

来源:互联网 发布:手机怎么进去淘宝秒杀 编辑:程序博客网 时间:2024/06/05 01:52
  1. //
  2. //  main.c
  3. //  算法入门2
  4. //
  5. //  Created by tarena on 15/5/28.
  6. //  Copyright (c) 2015年 com.tarena.wanq. All rights reserved.
  7. //
  8. #include <stdio.h>
  9. /* 题目0
  10. */
  11. void func();
  12. void func()
  13. {
  14.    
  15. }
  16. /* 题目1
  17. 位数(digit)
  18. 输入一个不超过10的9次方的正整数,输出它的位数。
  19. */
  20. void digit();
  21. void digit()
  22. {
  23.    int num,i;
  24.    scanf("%d",&num);
  25.    while(num>=1){
  26.        num/=10;
  27.        i++;
  28.    }
  29.    printf("%d",i);
  30. }
  31. /* 题目2
  32. 水仙花(daffodil)
  33. 输出100~999中的所有水仙花数。若3位数ABC满足ABC=A平方+B平方+C平方,则称其为水仙花数。
  34. */
  35. void daffodil();
  36. void daffodil()
  37. {
  38.    int a,b,c;
  39.    for(a = 1; a<=9; a++){
  40.        for (b=0; b<=9; b++) {
  41.            for (c = 0; c<=9; c++) {
  42.                int sum1 = a*100+b*10+c;
  43.                int sum2 = a*a*a+b*b*b+c*c*c;
  44.                //printf("%4d",sum1);
  45.                if(sum1 == sum2){
  46.                    printf("%4d",sum1);
  47.                }
  48.            }
  49.        }
  50.    }
  51. }
  52. /* 题目3
  53. 韩信点兵(hanxin)
  54. 相传寒心才智过人,从不直接清点自己军队人数,只要让士兵先后以3人一排、五人一排、七人一排的变换对象,而他每次只掠一眼队伍的排尾就知道总人数了。输入3个非负整数a,b,c,表示没中队形排尾的人数(a<3,b<5,c<7),输出总人数的最小值(或报告误解)。已经总人数不小于10,不超过100。
  55. */
  56. void hanxin();
  57. void hanxin()
  58. {
  59.    int a,b,c;
  60.    scanf("%d%d%d",&a,&b,&c);
  61.    for(int i=0;i<=100;i++){
  62.        if(i%3==a&&i%5==b&&i%7==c){
  63.            printf("%d",i);
  64.            return;
  65.        }
  66.    }
  67.    printf("No answer");
  68. }
  69. /* 题目4
  70. 倒三角形(triangle)
  71. 输入正整数n<=20,输出一个n层的倒三角形。
  72. *****
  73.  ***
  74.   *
  75. */
  76. void triangle();
  77. void triangle()
  78. {
  79.    int n;
  80.    scanf("%d",&n);
  81.    
  82.    for (int i=0; i<n; i++) {
  83.        for (int j=0; j<i; j++) {
  84.            printf(" ");
  85.        }
  86.        for (int k=0; k<2*(n-i)-1; k++) {
  87.            printf("*");
  88.        }
  89.        printf("\n");
  90.    }
  91. }
  92. /* 题目5
  93. 统计(stat)
  94. 输入一个正整数n,然后读取n个正整数a1,a2,...an,最后再读一个正整数m。统计a1,a2,...an中有多少个整数的值小于m.
  95. 提示重定向和fopen都可以使用。
  96. */
  97. void mystat();
  98. void mystat()
  99. {
  100.    
  101. }
  102. /* 题目6
  103. 调和级数(harmony)
  104. 输入正整数n,输出H(n)=1+1/2+1/3+1/4+...+1/n的值,保留3位小数。例如n=3时答案位1.833。
  105. */
  106. void harmony();
  107. void harmony()
  108. {
  109.    int n;
  110.    scanf("%d",&n);
  111.    float sum=0;
  112.    while (n) {
  113.        sum += 1.0/n--;
  114.    }
  115.    printf("%.3f",sum);
  116. }
  117. /* 题目7
  118. 近似计算(approximation)
  119. 计算pi/4 = 1-1/3+1/5-1/7+...,知道最后一项小与10的-6次方。
  120. */
  121. void approximation();
  122. void approximation()
  123. {
  124.    float checkNum = 0.000001;
  125.    int i=1,flag = 1;
  126.    float sum = 0.0f;
  127.    while (flag) {
  128.        float t = 1.0/(2*i-1);
  129.        if(i%2==0){
  130.            sum -= t;
  131.        }else{
  132.            sum += t;
  133.        }
  134.        if (t<checkNum) {
  135.            flag = 0;
  136.        }
  137.        i++;
  138.    }
  139.    printf("%f",sum);
  140. }
  141. /* 题目8
  142. 子序列的和(subsequence)
  143. 输入两个正整数n<m<10的6字方,输出1/n平方+1/(n+1)平方+。。。+1/m平方,保留5位小数。
  144. 例如n=2,m=4时答案是0.42361, n=65536, m=655360时答案位0.00001.
  145. */
  146. void subsequence();
  147. void subsequence()
  148. {
  149.    int n,m;
  150.    float sum = 0.0;
  151.    scanf("%d%d",&n,&m);
  152.    for (int i=n; i<=m; i++) {
  153.        sum += 1.0/(i*i);
  154.    }
  155.    printf("%f",sum);
  156. }
  157. /* 题目9
  158. 分数化小数(decimal)
  159. 输入正整数a,b,c,输出a/b的小数形式,精确到小数点后c位。
  160. */
  161. void decimal();
  162. void decimal()
  163. {
  164.    int a,b,c,result;
  165.    scanf("%d%d%d",&a,&b,&c);
  166.    double f = a/b;
  167.    int i = c;
  168.    while (i) {
  169.        f*=10;
  170.        i--;
  171.    }
  172.    result = f;
  173.    i = c;
  174.    while (i) {
  175.        f = result/10.0;
  176.    }
  177.    printf("%lf",f);
  178. }
  179. /* 题目10
  180. 排列(permutation)
  181. 用1,2,3,..9,组成3个三位数abc,def和ghi,每个数恰好使用一次,要求abc:def:ghi=1:2:3.输出所有解。
  182. */
  183. void permutation();
  184. void result(int num, int * result_add, int * result_mul);
  185. void result(int num, int * result_add, int * result_mul)
  186. {
  187.    int i, j, k;
  188.    
  189.    i = num / 100;        //百位
  190.    j = num / 10 % 10;    //十位
  191.    k = num % 10;         //个位
  192.    
  193.    *result_add += i + j + k;    //分解出来的位数相加
  194.    *result_mul *= i * j * k;    //相乘
  195. }
  196. void permutation()
  197. {
  198.    int i, j, k;
  199.    int result_add, result_mul;
  200.    
  201.    for(i = 123; i <=329; i++)
  202.    {
  203.        j = i * 2;
  204.        k = i * 3;
  205.        
  206.        result_add = 0;
  207.        result_mul = 1;
  208.        
  209.        
  210.        
  211.        result(i, &result_add, &result_mul);
  212.        result(j, &result_add, &result_mul);
  213.        result(k, &result_add, &result_mul);
  214.        
  215.        if(result_add == 45 && result_mul == 362880)
  216.            printf("%d %d %d\n", i, j, k);
  217.    }
  218. }
  219. int main(int argc, const char * argv[])
  220. {
  221.    // insert code here...
  222.    printf("Hello, World!\n");
  223. //    digit();
  224. //    daffodil();
  225. //    hanxin();
  226. //    triangle();
  227. //    approximation();
  228. //    subsequence();
  229.    permutation();
  230.    return 0;
  231. }

0 0
原创粉丝点击