题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月得兔子总数为多少?
程序分析:兔子得规律为数列1,1,2,3,5,8,13,21....
#include<cstdio>long long f1,f2,f;int main(){ f1 = f2 = 1; printf("1 1"); for(int i = 1;i <= 20;i++) { f = f1 + f2; f1 = f2; f2 = f; printf(" %d",f); } // 斐波那契数列,f_(i+1) = f_(i) + f_(i-1) // 可以试试什么时候会超范围 }
题目12
题目:判断101-200之间有多少个素数,并输出所有素数。
程序分析:判断素数得方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。
#include<cstdio>bool is_prime(int x){ for(int i = 2;i * i <= x;i++) if(x % i == 0) return false; return true;}int main(){ for(int i = 101;i <= 200;i++) if(is_prime(i)) printf("%d\n",i); // 感兴趣得同学可以去查查线性筛素数。 // 这里算法复杂度大概为O(n^{3/2}) // 好久不算了忘记怎么算复杂度了。。。 }
题目13
题目:打印出所有得“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1得三次方+5得三次方+3得三次方。
程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。
(1)如果这个质数恰等于n,则说明分解质因数得过程已经结束,打印出来即可。
(2)如果n<>k,但n能被k整除,则应打印出k得值,并用n除以k得商,作为新得正整数n,重复执行第壹步。
(3)如果n不能被k整除,则用k+1作为k得值,重复执行第壹步。
#include<cstdio>int main(){ for(int a,b,c,i = 100;i < 1000;i++) { //可以猜猜abc分别代表个位十位百位千位 a = i / 100; b = (i / 10) % 10; c = i % 10; //虽然运算符等级有限定,但是加括号是个好习惯 if((a*a*a + b*b*b + c*c*c) == (a*100 + b*10 + c)) printf("%-5d",i);//还记不记得-5d代表什么 }}
题目14
题目:将一个正整数分解为质因数。例如:输入90,打印出90=233*5。
程序分析:对n进行分解质因数,应先找到一个最小得质数k,然后按下述步骤完成:
#include<cstdio>//可以先了解一下唯一分解定理 //写这个程序前建议先判断一下是不是素数。(或许没用int x; int main(){ scanf("%d",&x); for(int i = 2;i <= x;i++) { while(x != i) { if(x % i) break; printf("%d*",i); x /= i; } } printf("%d", x);//想想为什么要最后输出一个这个 }
题目15
题目:利用条件运算符得嵌套来完成此题:学习成绩>=90分得同学用A表示,60-89分之间得用B表示,60分以下得用C表示。
程序分析:(a>b)?a:b这是条件运算符得基本例子
#include<cstdio>int score;char grade;// (a > b) ? 1:2 如果a>b成立我们得到得值为1,否则得到2 int main(){ scanf("%d",&score); //按照运算符运算顺序来看无所谓,个人偏向加括号。 grade = (score >= 90) ? 'A' : ((score >= 60) ? 'B' : 'C'); printf("your grade is %c",grade);}