1.求符合给定条件的整数集
给定不超过6的正整数A,考虑从A开始的连续4个数字,请输出所有由它们组成的无重复数字的3位数
输入格式:
输入在一行中给出A
输出格式:
输出满足条件的3位数,要求从小到大,每行6个整数,整数间以空格分隔,但行末不能有多余空格
输入样例:2
输出样例:
234 235 243 245 253 254
324 325 342 345 352 254
423 425 432 435 452 453
523 524 532 534 542 543
int main()
{
int a;
scanf("%d",&a);
int i,j,k;
int cnt=0;
i=a;
while(i<=a+3){
j=a;
while(j<=a+3){
k=a;
while(k<=a+3){
if(i!=j){
if(i!=k){
if(j!=k){
cnt++;
printf("%d%d%d",i,j,k);
//printf("%d",i*100+j*10+k);两种输出选一种
if(cnt==6){
printf("\n");
cnt=0;
}else{
printf(" ");
}
}
}
}
k++;
}
j++;
}
i++;
}
return 0;
}
2.水仙花数
水仙花数是N位的正整数(N>=3),它的每个位上的数字的N次幂之和等于它本身,例如:153=1的三次方+5的三次方+3的三次方
要求编写程序,计算所有N位水仙花数
输入格式:
输入在一行中给出一个正整数N(3<=N<=7).
输出格式:
按递增顺序输出所有N位水仙花数,每个数字占一行
输入样例:
3
输出样例:
153
370
371
int main()
{
int n;
scanf("%d",&n);
int first=1;//first是最小的n位数,如最小的三位数100
int i=1;
//i从0开始走到小于n要走n遍,从1开始走到小于n,要走n-1遍
//正好需要构建first时,需要乘以(n-1)次10,所以i从1开始
while(i<n){
//为了帮忙算出first
first*=10;
i++;
}
printf("first=%d\n",first);//为了便于观察,可以在这里看一下first的值
//假设n=3,遍历所有三位数100--999
i=first;
while(i<first*10){//i要从first走到first*10
//此时需要分解这个i,算出它的每一位数,再进行每一位数的n次幂求和
int t=i;//需要有一个临时变量记录i,因为分解的时候会破坏掉i,所以要记录
int sum=0;//记录每一位的n次幂累加的结果
do{
int d=t%10;//t的最低位
t/=10;
int p=1;//保留幂次的结果
int j=0;//计数变量
while(j<n){
//从0到n,循环进行n次
p*=d;
//注意p初始值是1,我们需要d的n次幂时,d*d,要乘(n-1)次遍,虽然循环走n遍,但是循环第一遍做的是1*d
//用p=d,j=1,也可以,循环n-1遍,第一步就是d*d
j++;
}
sum+=p;
}while(t>0);
if(sum==i){
printf("%d\n",i);
}
i++;
}
return 0;
}
3.打印九九乘法口诀表
本题要求对任意给定的1位正整数N,输出从11到NN的部分口诀表
输入格式:
输入在一行中给出一个正整数N(1<=N<=9)
输出格式:
输出下三角N*N部分口诀表,其中等号右边占4位,左对齐
int main()
{
int n;
scanf("%d",&n);
int i,j;//j是第一个数字,i是第二个数字,j是行
i=1;
while(i<=n){
j=1;
while(j<=i){
printf("%d*%d=%d",j,i,i*j);
if(i*j<10){
printf(" ");//三个空格
}else{
printf(" ");//两个空格
}
j++;
}
printf("\n");
i++;
}
return 0;
}
4.统计素数并求和
本题要求统计给定整数M和N区间内素数的个数并对它们求和
输入格式:
输入在一行中给出2个正整数M和N(1<=M<=N<=500)
输出格式:
在一行中顺序输出M和N区间内素数的个数,以及它们的和,数字间以空格分隔
输入样例:
10 31
输出样例;
7 143
int main()
{
int m,n;
int i;
int cnt=0;//需要统计个数,所以要有计数器
int sum=0;
scanf("%d %d",&m,&n);
if(m==1){
//首先 1不是素数
//若没有这一段程序,若测试用例中m等于1,则i等于1,则下方k=2,k<i-1,不成立,
//此时isprime值为1,将会判断出1是素数
m=2;//如m值为1,不防让m=2,从2开始判断,因为反正1不是素数,要被拿走
}
for(i=m;i<=n;i++){//循环从m走到n
int isPrime=1;
int k;
for(k=2;k<i;k++){
if(i%k==0){//不是素数
isPrime=0;
break;
}
}
//判断i是不是素数
if(isPrime){
cnt++;
sum+=i;
}
}
printf("cnt=%d,sum=%d\n",cnt,sum);
return 0;
}
5.猜数字游戏
和之前所写的猜数字游戏不同,此题是由人产生随机数,计算机来猜数字
猜数字游戏是令系统随机产生一个100以内的正整数,用户输入一个数对其进行猜测,
需要你编写程序,自动对其与随机产生的被猜数进行比较,并提示大了(“Too big”),还是小了(“Too small”),
相等表示猜到了,如果猜到,则结束程序。程序还要求统计猜的次数
如果1次猜出该数,提示"Bingo!";
如果3次以内猜到该数,则提示"Lucky you!";
如果超过3次但是在N(>3)次以内(包括第N次)猜到该数,则提示”Good Guess!"
如果超过N次都没猜到,则提示"Game Over",并结束程序
如果在到达N次之前,用户输入了一个负数,也输出"Game Over",并结束程序。
输入格式:
输入第一行中给出2个不超过100的正整数,分别是系统产生的随机数
以及猜测的最大次数N,随后每行给出一个用户的输入,直到出现负数为止
输出格式:
在一行中输出每次猜测相应的结果,直到输出猜对的结果或"Game Over"则结束
输入样例:
58 4
70
50
56
58
60
-2
int main()
{
int number,n;//用户给的数字和可猜测的次数
int inp;//计算机每次所猜的数字
int finished=0;//用于控制循环要不要退出的
int cnt=0;//记录猜测次数
scanf("%d %d",&number,&n);
do{
scanf("%d",&inp);
cnt++;
if(inp<0){
printf("Game Over\n");
finished=1;
}else if(inp>number){
printf("Too Big\n");
}else if(inp<number){
printf("Too Small\n");
}else{
if(cnt==1){
printf("Bingo!\n");
}else if(cnt<=3){
printf("Lucky you!\n");
}else{
printf("Good Guess!\n");
}
finished=1;
}
if(cnt==n){//如果输入次数与给定次数已经相等了
if(!finished){//并且还没有finished
printf("Game Over!\n");
finished=1;
}
}
}while(!finished);
return 0;
}
6.求序列前N项和
本题要求编写程序,计算序列2/1+3/2+5/3+8/5+……的前N项之和,
注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子
输入格式:
输入在一行中给出一个正整数N
输出格式:
在一行中输出部分和的值,精确到小数点后2位,题目保证计算结果不超过双精度范围
输入样例;
20
输出样例:
32.66
int main()
{
int n;
double dividend,divisor;//分子,分母,
//当给的n较大时,虽然相除所得得数也许较小,但分子分母已经很大,考虑超出int表达界限,因此用了double型
double sum=0.0;
int i;
double t;//t类型要与分子相同
scanf("%d",&n);
dividend=2;
divisor=1;
for(i=1;i<=n;i++){
sum+=dividend/divisor;
t=dividend;
dividend=dividend+divisor;
divisor=t;
}
printf("%.2f\n",sum);
return 0;
}
7.约分最简分式
分数可以表示为(分子/分母)的形式。
编写一个程序,要求用户输入一个分数,然后将其约分为最简分式。
最简分式是指分子和分母不具有可以约分的成分了。如6/12被约分为1/2.
当分子大于分母时,不需要表达为整数又分数的形式,即11/8还是11/8
而当分子分母相等时,仍然表达为1/1的分数形式
输入格式:
输入在一行中给出一个分数
输出格式:
格式与输入相同,为这个分数的最简分式
提示:在scanf的格式字符串中加入"/",让scanf来处理这个斜杠
输入样例:
60/120
输出样例:
1/2
int main()
{
int dividend,divisor;
scanf("%d/%d",÷nd,&divisor);
int a=dividend;//保存分子分母,不然在计算过程中它们会被消耗掉
int b=divisor;
int t;
while(b>0){//算出a是最大公约数
t=a%b;
a=b;
b=t;
}
printf("%d/%d\n",dividend/a,divisor/a);
return 0;
}
8.念数字
输入一个整数,输出每个数字对应的拼音,当整数为负数时,先输出"fu"字,
输入格式:
输入在一行中给出一个整数,如1234
提示整数包括负数、零和正数
输出格式:
在一行中输出这个整数对应的拼音,每个数字的拼音之间用空格分开,行末没有最后的空格,如:yi er san si。
输入样例
-600
输出样例:
fu liu ling ling
int main()
{
int x;
scanf("%d",&x);
if(x<0){
printf("fu");
x=-x;//翻过来变成正的,下面就一样去处理
}
int mask=1;
int t=x;
while(t>9){//第一个循环来求出mask
t/=10;
mask*=10;
}
do{
int d=x/mask;//第二个循环用mask把整数从最高位分解到最低位
switch(d){
case 0:printf("ling");break;
case 1:printf("yi");break;
case 2:printf("er");break;
case 3:printf("san");break;
case 4:printf("si");break;
case 5:printf("wu");break;
case 6:printf("liu");break;
case 7:printf("qi");break;
case 8:printf("ba");break;
case 9:printf("jiu");break;
}
if(mask>9) printf(" ");//若mask>9,意味着后面还可以再分解,即不是最后一位,所以加空格
x%=mask;
mask/=10;
}while(mask>0);
printf("\n");
return 0;
}
9.求a的连续和
输入两个整数a和n,a的范围是[0,9],n的范围是[1,8],求数列之和S=a+aa+aaa+……+aaaa……a(n个a),
如a为2,n为8时输出的是2+22+222+……+22222222的和
输入格式:
输入在一行中给出两个整数,先后表示a和n
输出格式:
在一行中输出要求的数列之和
输入样例:
2 4
输出样例:
2468
int main()
{
int a,n;
scanf("%d %d",&a,&n);
int sum=0;
int i;
//2 2*10+2 (2*10+2)*10+2
int t=0;//每一轮是新的数字,如第一轮是2,第二轮是22,第三轮是222,用来表达每一轮的数字
for(i=0;i<n;i++){
t=t*10+a;
sum+=t;
}
printf("%d\n",sum);
return 0;
}