C语言经典100例20
题目16
题目: 输入两个正整数m和n,求其最大公约数和最小公倍数。
程序分析: 利用辗辗转相除法。
(这里的一行gcd本质上就是辗转相除法,可以想想是不是等价的) #include int gcd(int x,int y){return x % y ? gcd(y,x%y) : y;} // 一行gcd int m,n; int main() { scanf("%d%d",&m,&n); printf("gcd is:%d ",gcd(m,n)); printf("lcm is:%d ",m*n / gcd(m,n)); // 结论 }题目17
题目: 输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
程序分析: 利用while语句,条件为输入的字符不为" #include int num_letter,num_space,num_digit,num_other; //全局变量的初始值为0 int main() { char c; while((c = getchar())!=" ") { // 可以想想怎么把大写与小写写在一个if中 if(c >= "a" && c <="z")//小写情况 num_letter ++; else if(c >= "A" && c <= "Z")//大写情况 num_letter ++; else if(c == " ") num_space++; else if(c >= "0" && c <= "9") num_digit++; else num_other++; } // 其实输出不建议写这么长… printf("letter : %d, space : %d, digit : %d, other : %d",num_letter,num_space,num_digit,num_other); }题目18
题目: 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。
例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘控制。
程序分析: 关键是计算出每一项的值 #include int x,n,ans,temp; int main() { scanf("%d%d",&x,&n); for(int i = 1; i <= n;i++) { temp += x; ans += temp; x *= 10; } printf("ans is:%d",ans); }题目19
题目: 一个数如果恰好等于它的因子之和,这个数就称为"完数"。
例如6=1 2 3.编程找出1000以内的所有完数 #include int main() { for(int x,i = 2;i < 1000;i++) { x = 1; //这里虽然想法简单,但是代码难度增加了 for(int j = 2;j * j <= i;j++) { if(j * j == i) { x = x + j; continue;// } if(i % j == 0) x = x + j + i / j; } if(x == i) printf("%d ",i); } }题目20
题目: 一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多
高?
程序分析: 见下面注释 #include float H = 100.0,sum_ans = 100.0;// 第一次掉落的为100m int main() { for(int i = 1;i <= 10;i++) { H = H / 2.0; sum_ans += H*2.0; } printf("total is %f ", sum_ans);//299.804688 printf("the tenth is %f ",H);//0.097656 } //这种物理类问题建议先手推一下,这里我甚至不能保证我的答案正确-.- //Question:这里使用double和float的输出结果会不会不一样,为什么?