### 学习中碰到的许多例题
- 水仙花数
水仙花数指的是指一个三位数,其各位数字立方和等于该数,如:153就是一个水仙花数,153=1×1×1+5×5×5+3×3×3
题目:找出三位数的所有水仙花数;
代码要求找出所有的水仙花数,代码如下:
#include <stdio.h>
int main()
{
//定义三位数num,个位数sd,十位数td,百位数hd
int num, sd, td, hd;
//循环所有三位数
for(num=100;num<1000;num++)
{
//获取三位数字num百位上的数字
hd = (num/100) ;
//获取三位数字num十位上的数字
td = (num%100)/10 ;
//获取三位数字num个位上的数字
sd = (num%100)%10 ;
//水仙花数的条件是什么?
if( hd*hd*hd+td*td*td+sd*sd*sd == num )
{
printf("水仙花数字:%d\n", num);
}
}
return 0;
}
水仙花数的大概算法就是通过for循环提取出每一位数,再利用if语句判断最后输出。
当然,也可以换一种循环,大致就是这样的算法。
- 9×9乘法表
乘法表是for循环中比较有代表性的东西,还可以各种变向,先来一个最平常的吧。
#include<stdio.h>
int main()
{
int i,j;//定义变量
for(i=1;i<10;i++)
{
for(j=1;j<=i;j++)
{
printf("%d*%d=%-4d",j,i,i*j);/*为了代码能够美观,
利用格式字符的不同变化形式控制间距*/
}
}
return 0;
}
利用for循环的嵌套还可以,做出许多更强的东西。此时此刻,我想要引用某位大佬的题目。打印n*n法表,要求位与位对齐,这时我们只需要稍微改进下;
如以下代码:
#include<stdio.h>
int main()
{
int i,j,n;
scanf("%d*%d",&n,&n);
for(i=1;i<=n;i++)
{
for(j=1;j<=i;j++)
{
printf("%d*%d=%-4d",j,i,i*j);
}
printf("\n");
}
return 0;
}
只要输入n*n就可以输出各种奇葩乘法表;如
- 回文数
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数
代码如下:
#include <stdio.h>
int main()
{
int t,s=0,n;
printf("输入数字:");//输出
scanf("%d",&n);//输入
t=n;//赋值
while(t)//当t<10时,t/10=0,t=0时就是循环结束时
s=s*10+t%10,t/=10;//这个运算方法是关键
if(s==n)printf("是\n");//判断
else printf("不是\n");
}
回文数并不是很难。用数组处理也可以,当然要麻烦些,所以,麻烦的东西就用来处理麻烦的事情吧!
回文字符串
回文字符串就是正读反读都一样的字符串,如“abcba”、“abccba”。要求从键盘输
入字符串。
先看思路:
回文字符串的思路
1,定义一个数组,字符数组,再定义四个整形常量i c n j=0
2, 在不知道输入多少个字符时,最好利用while循环输入while((c=getchar())!=’\n’)这条语句就是
在输入回车时,结束循环,当然,循环次数需要一个计数器,于是进去一个计数器j,执行j++
3,把j的值赋给n,
4,接下来进行循环,for语句中i=0;i<n/2;i++,j–,各项要注意
5, for循环中要添加if语句if(a[i]==a[j-1])
if(a[i]==a[j-1]){/*如果有5个字母,n=5,n/2=2,
只需要对比a[0]和a[4];a[1]和a[3];所以,只需要控制
i的范围在n/2以内,不包括n/2,中间字母不用对比。
这个就可以导出循环的控制语句。*/
if(i==n/2-1)
{
printf("YES!");
} }
else
{
printf("NO!");
break;
}
是回文字符串输出yes,不是输出no
代码如下:
#include<stdio.h>
int main()
{
char a[30];
int i,c,n,j=0;
while((c=getchar())!='\n')
{
a[j]=c;
j++;
}
n=j;
for(i=0;i<n/2;i++,j--)
{
if(a[i]==a[j-1])
{
if(i==n/2-1)
{
printf("YES!");
}
}
else
{
printf("NO!");
break;
}
}
return 0;
}
利用更简便的方法解决问题,才是学习的关键。