一. 顺序结构
1.大小写字母转换
从键盘上输入一个小写字母字符,将其转换为对应的大写字母字符。分别输出转换前后的字母字符及其对应的ASCII码值。
【输入形式】
输入一个小写字母字符。
【输出形式】
分别输出转换前后的字母字符及其对应的ASCII码值。
【样例输入】
b
【样例输出】
b,B
98,66
解:完成此题首先要知道在C语言中大小写字符都有对应的ASCII码值且其遵循着一定的规律。
我们不需要记住所有的ASCII码表中的数字,使⽤时查看就可以,不过我们最好能掌握⼏组特殊的数
据:
• 字符A-Z的ASCII码值从65~90
• 字符a-z的ASCII码值从97~122
• 对应的⼤⼩写字符(a和A)的ASCII码值的差值是32
• 数字字符0-9的ASCII码值从48~57
• 换⾏ \n 的ASCII值是:10
• 在这些字符中ASCII码值从0~31这32个字符是不可打印字符,⽆法打印在屏幕上观察
#include<stdio.h>
int main()
{
char a;
scanf("%c",&a);
printf("%c,%c\n%d,%d\n",a,a-32,a,a-32);
return 0;
}
%c,%d等 被称为占位符,在printf函数中 占位符与参数要一一对应。
ps:如果有n个占位符那么有n+1个参数。
2.交换变量值
从键盘上输入两个任意整数(两个整数间以逗号分隔),分别保存在x和y变量中,交换两个变量中的值后进行输出。
【输入形式】
输入两个任意整数(两个整数间以逗号分隔)。
【输出形式】
交换两个变量中的值后进行输出(两个整数间以逗号分隔)。
【样例输入】
5,9
【样例输出】
9,5
要实现两个变量的交换,简单举例,有两个瓶子一个装醋一个装酱油,那么如何将两个瓶子所装东西调换呢? 可以想到拿出一个空瓶子,先将醋倒进去,再将酱油倒进醋瓶,最后将空瓶中被倒入的醋倒在酱油瓶中,这样实现了两者交换。
用C语言如何实现呢,代码如下:
#include<stdio.h>
int main()
{ int a;int b ;
scanf("%d,%d",&a,&b);
printf("%d,%d\n",b,a);
return 0;
}
3.求三个数的平均值
编写一个C语言程序,输入a,b,c三个整数值,计算并输出其平均值.
【输入形式】
输入仅一行,输入三个整型数据。(输入数据用一个空格间隔)
【输出形式】
输出仅一行,输出平均值,6位有效位。
【样例输入】
1 2 2
【样例输出】
1.666667
C语言数据计算特点,整数/整数得到整数,小数/整数或整数/小数或小数除小数才能得到小数。
代码示例:
#include<stdio.h>
int main()
{int a;int b;int c;
scanf("%d%d%d",&a,&b,&c);
float sum=a+b+c;
printf("%f\n",sum/3);
return 0;
}
4.求两点之间距离
编一程序,求两点之间的距离。已知直角坐标系中两点(x1,y1)和 (x2,y2),公式求取两点间距离。
【输入形式】
输入仅一行,输入4个任意数(2个坐标点的横纵坐标值)x1,y1;x2,y2
【输出形式】
输出仅一行,输出两点间距离值。
【样例输入】
0 0 1 1(x1=0,y1=0;x2=1,y2=1)
【样例输出】
1.414214
这里要想到数学公式
#include<stdio.h>
#include<math.h>
int main()
{
float x1,y1;float x2,y2;
scanf("%f%f%f%f",&x1,&y1,&x2,&y2);
double k=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2),l;
l=sqrt(k);//这里要对k进行开平方用到数学函数,则要引用头文件 include<stdio.h>
printf("%f\n",l);
return 0;
}
5.摄氏温度转化为华氏温度和绝对温度
编一程序,将输入的摄氏温度C转换为华氏温度F和绝对温度K。 转换公式为: F=9/5C+32 K=273.16+C
【输入形式】
输入仅一行,输入一个摄氏温度数C
【输出形式】
输出仅一行,输出其华氏温度F和绝对温度K,输出数据间隔为一个空格,输出数据保留2位小数。
【样例输入】
36.2
【样例输出】
F=97.16 K=309.36
根据题目要求,输入摄氏温度,依据给定公式计算出华氏温度和绝对温度并输出
代码示例:
#include<stdio.h>
int main()
{
float C,F,K;
scanf("%f",&C);
F=9.0/5*C+32;
K=273.16+C;
printf("F=%.2f K=%.2f\n",F,K);//题目要求保留两位小数,则对应写法为%.2f
return 0;
}
二.选择结构
1.奇偶数判断
给定一个整数,判断该数是奇数还是偶数。
【输入形式】
输入仅一行,一个大于零的正整数n。
【输出形式】
输出仅一行,如果n是奇数,输出odd;如果n是偶数,输出even。
【样例输入】
5
【样例输出】
odd
要判断一个数是奇数还是偶数可以看其除以2之后的余数,若余数为0则为偶数,否则为奇数
#include<stdio.h>
int main()
{ int n=0;
scanf("%d",&n);
if(n%2==0)
{
printf("even\n");
}
else
{
printf("odd\n");
}
return 0;
}
2.求三个数的最大值
编一程序,将3个整数a、b、c由键盘输入,输出其中的最大者
【输入形式】
输入仅一行,输入3个整数
【输出形式】
输出仅一行,输出3个数中的最大值
【样例输入】
3 2 6
【样例输出】
max=6
先两两进行比较确定一个最大值,再用第三个数和最大值进行比较,如果大于最大值则将第三个数赋给最大值
代码示例如下:
#include<stdio.h>
int main()
{
int a; int b; int c; int max;
scanf("%d%d%d",&a,&b,&c);
if(a>b)
{
max=a;
}
else
{
max=b;
}
if(c>max)
{
max=c;
}
printf("max=%d\n",max);
return 0;
}
3.输入0-6的数字,输出对应星期的英文
请输入0-6的数字,输出对应星期的英文。如果输入不正确,则输出"Error"。0~6星期对应为: Sunday, Monday,Tuesday,Wednesday,Thursday,Friday,Saturday。
【输入形式】
输入任意一个整数。
【输出形式】
如果输入的整数在0~6之间,将输出对应星期的英文,否则输出“Error”。
【样例输入】
0
【样例输出】
Sunday
一开始拿到题目很容易想到用if语句判断输入的值来完成输出,但switch语句更适合来解决此类问题。
首先介绍switch语句:
switch 语句是⼀种特殊形式的 if…else 结构,⽤于判断条件有多个结果的情况。它把多重
的 else if 改成更易⽤、可读性更好的形式。
上⾯代码中,根据表达式 expression 不同的值,执⾏相应的 case 分⽀。如果找不到对应的值,
就执⾏ default 分⽀。
注:
• switch 后的 expression 必须是整型表达式
• case 后的值,必须是整形常量表达式
代码示例如下:
#include<stdio.h>
int main()
{ int x;
scanf("%d",&x);
switch(x)
{
case 0:printf("Sunday");break;
case 1:printf("Monday");break;
case 2:printf("Tuesday");break;
case 3:printf("Wednesday");break;
case 4:printf("Thursday");break;
case 5:printf("Friday");break;
case 6:printf("Saturday");break;
default:printf("Error\n");
}
return 0;
}
4.三个数排序
编写程序,实现输入3个整数,要求按由大到小的顺序输出。 说明:对这个程序进行测试时,需要6组测试数据均能得到正确的输出结果,才能说明程序正确。 a b c a c b b a c b c a c b a c a b
【输入形式】
输入仅一行,输入三个整数。
【输出形式】
输出仅一行,按从大到小顺序输出这三个整数。
【样例输入】
2 4 3
【样例输出】
4>3>2
上面我们说过较为简单的求三个数最大值,这里要实现三个数的比较大小,可以用打擂台的方式实现。
具体操作,先将一个变量定为最大,用剩余变量和其进行比较,若有变量对应的值比它大,则将这个变量赋为最大值
代码实现如下:
#include<stdio.h>
int main()
{
int a;int b;int c;int k=0 ;
scanf("%d%d%d",&a,&b,&c);
if(a<b)
{
k=b;
b=a;
a=k;
}
if(a<c)
{
k=c;
c=a;
a=k;
}
if(b<c)
{
k=c;
c=b;
b=k;
}
printf("%d>%d>%d",a,b,c);
return 0;
}
5.分段函数
编程按下式计算y的值,x的值由键盘输入。(可用if和switch实现) x、 y均按float类型
【输入形式】
输入仅一行,输入一个数值。
【输出形式】
输出仅一行,输出相应的数据值(小数点后保留2位有效位)或no definition(两单词中间有一空格)。
【样例输入】
1
【样例输出】
y=0.84
#include<stdio.h>
#include<math.h>
int main()
{
float x;
float y;
scanf("%f",&x);
if(0<=x&&x<40)
{
if(0<=x&&x<10)
{
y=sin(x);
}
if(10<=x&&x<20)
{
y=cos(x);
}
if(20<=x&&x<30)
{
y=(exp(x)-1);
}
if(30<=x&&x<40)
{
y=log(x+1);
}
printf("y=%.2f",y);
}
else
{
printf("no definition");
}
return 0;
}
三.选择结构(二)
1.实现简单数值运算
从键盘输入两个数值和一个运算符,自动完成相应的运算。输入的运算符只能是+、-、*、/ 这4种符号,输入的数值及运算结果均定义为float类型,小数点后均只保留2位有效位,除法运算时除数不能为0。当运算符不正确,或者除法运算时除数为0时,输出input error。
【输入形式】
输入有两行,第一行为两个实数,两个实数之间用逗号分隔;第二行输入一个运算符
【输出形式】
输出仅一行,输出相应的运算式及计算结果,或输出input error(两单词中间有一空格)。
【样例输入】
11,5.9
+
【样例输出】
11.00+5.90=16.90
#include <stdio.h>
int main()
{
float a,b,sum,x,j,k;
char c;
scanf("%f,%f\n",&a,&b);
sum=a+b;
x=a-b;
j=a*b;
k=a/b;
scanf("%c",&c);
if(c=='+')
{
printf("%.2f+%.2f=%.2f",a,b,sum);
}
else if(c=='-')
{
printf("%.2f-%.2f=%.2f",a,b,x);
}
else if(c=='*')
{
printf("%.2f*%.2f=%.2f",a,b,j);
}
else if(c=='/'&&b!=0)
{
printf("%.2f/%.2f=%.2f",a,b,k);
}
else if(c!='+,-*/')
{
printf("input error");
}
else if(c=='/'&&c==0)
return 0;
}
2.百分值转换成相应的等级
编一程序,输入一个百分制的成绩(整数类型),按要求输出相应的字符串信息,对应关系为: excellent 90-100 good 80-89 middle 70-79 pass 60-69 fail 60以下或100以上
【输入形式】
输入仅一行,输入一个百分制的整数分数
【输出形式】
输出仅一行,输出其对应的字符信息
【样例输入】
85
【样例输出】
good
嵌套的if else 结构 注意范围界定
#include<stdio.h>
int main()
{
int f;
scanf("%d",&f);
if(f>=90&&f<=100)
{
printf("excellent");
}
else if(f>=80&&f<90)
{
printf("good");
}
else if(f>=70&&f<80)
{
printf("middle");
}
else if(f>=60&&f<70)
{
printf("pass");
}
else if(f<60||f>100)
{
printf("fail");
}
return 0;
}
3.根据月份,旅客订票张数和票价按优惠率计算费用
某航空公司规定:在旅游旺季1月份、7-9月份,如果订票20张及以上,优惠票价的5%,20张以下不优惠;在旅游淡季2-6月份、10-12月份,订票20张及以上,优惠20%,20张以下,优惠10%。编写一个能够根据月份、旅客订票张数和票价按优惠率计算费用的程序。
【输入形式】
输入3行,第1行输入月份(int类型),第2行输入订票张数(int类型),第3行输入单张票价(float类型)。
【输出形式】
输出仅一行,如果月份不在1-12月之间输出month error(两个单词中间有一个空格),否则输出应有的优惠率、优惠额和优惠后的总票价(数值中间用逗号间隔,优惠额和总票价保留小数点后2位)。
【样例输入】
1
22
245
【样例输出】
5%,269.50,5120.50
本题难度较低,但颇为复杂,注意题目要求解析每一句话。
#include <stdio.h>
int main()
{
int mon,num;//定义月份,和票数
float pri,yp,tp;//定义优惠率,优惠额,以及优惠后的票价
scanf("%d",&mon);
scanf("%d",&num);
scanf("%f",&pri);
if (mon==1||(mon>=7&&mon<=9))
{
if (num>=20)
{
yp=(num*pri)*0.05;
tp=(num*pri)*0.95;
printf("5%%,");
printf("%.2f,%.2f",yp,tp);
}
else
{
yp=(num*pri)*0;
tp=(num*pri);
printf("0%%,");
printf("%.2f,%.2f",yp,tp);
}
}
else if ((mon>=2&&mon<=6)||(mon>=10&&mon<=12))
{
if (num>=20)
{
yp=(num*pri)*0.20;
tp=(num*pri)*0.80;
printf("20%%,");
printf("%.2f,%.2f",yp,tp);
}
else
{
yp=(num*pri)*0.10;
tp=(num*pri)*0.90;
printf("10%%,");
printf("%.2f,%.2f",yp,tp);
}
}
else
{
printf("month error");
}
system("pause");
return 0;
}
四.循环结构(一)
1.求自然数n的各位数字之和
编写程序,求自然数n的各位数字之和,其中n的值由键盘输入。
【输入形式】
输入仅一行,输入n的值。
【输出形式】
输出仅一行,输出相应的和值。
【样例输入】
100
【样例输出】
sum=1
求一个自然数各位数之和首先应以个位求起,对于个位数是多少可以对这个自然数除10取其余数,那么以此类推,若要求十位数对应的数字只要将其也转换到个位即可求得,那么只要对自然数除10即可
代码实现如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n;int sum=0;
scanf("%d",&n);
while(n>0)
{
sum=sum+n%10;
n=n/10;//每一次求完最后一位数时将自然数除10使其成为新的自然数
}
printf("sum=%d",sum);
return 0;
}
2.求前n项和
【输入形式】
输入仅一行,输入n值(n>0)。
【输出形式】
输出仅一行,输出计算出的和值(用float类型)。结果保留小数点后4位
【样例输入】
10
【样例输出】
9.6126
对于这类表达式中含通项公式的问题很好解决,只要根据通项公式写出对应代码。
示例
#include <stdio.h>
int main()
{
int n,i;float s=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
s=s+(2.0*i-1)*(2.0*i+1)/((2.0*i)*(2.0*i));//用循环来实现将n从1开始每一次通项公式所算出的值求和
}
printf("%.4f",s);
return 0;
}
3.输入10个整数,输出所有负数,并求其和
编一程序,使得从键盘输入10个整数,可以输出其中的所有负数,并输出所有负数的和
【输入形式】
输入10个整数
【输出形式】
输出多行,先输出所有负数,最后输出所有负数和
【样例输入】
11 2 3 -1 9 8 5 4 -2 -3
【样例输出】
-1
-2
-3
sum=-6
#include <stdio.h>
int main()
{
int numbers[10];//定义一个数组用来存储10个整数
int sum = 0;
for (int i = 0; i < 10; i++)
{
scanf("%d", &numbers[i]);//使用循环将10个数输入数组numbers中
if (numbers[i] < 0)
{
sum += numbers[i];//判断输入的值,若为负,则对其求和,并输出。下面的循环可以不用,将其中的打印函数,放到此循环亦可
}
}
for (int i = 0; i < 10; i++)
{
if (numbers[i] < 0)
{
printf("%d\n", numbers[i]);
}
}
printf("sum=%d", sum);
return 0;
}
4.公式求π值
编一程序,利用公式求π的值,公式为: π/4=1-1/3+1/5-1/7+ …+1/(4n-3)-1/(4n-1) (按double计算保证计算精度)
【输入形式】
输入仅一行,输入n为整数
【输出形式】
输出仅一行,输出π值(保留2位小数)
【样例输入】
3000
【样例输出】
3.14
#include <stdio.h>
int main()
{
int n;
double pi = 0.0;
int sign = 1;//注意题中所给公式,有正负交替出现,此类问题可以先将运算都以加法处理然后设定一个变量对其赋值1(因为1乘任何数都等于那个数),并在循环中改变变量的正负号,因为循环是一次一次进行,那么一次一次改变正负号就达到了正负交替的效果
scanf("%d", &n);
for(int i = 0; i < n; i++)
{
double term = 1.0 / (2 * i + 1);
pi += sign * term;
sign = -sign;
}
pi *= 4.0;
printf("%.2lf\n", pi);
return 0;
}
5.输入两个整数,输出他们的最大公约数
从键盘上输入两个数据,显示它们的最大公约数。
【输入形式】
48 24
【输出形式】
24
【样例输入】
24 36
【样例输出】
12
/*
最大公约数:即两个数据中公共约数的最大者。
求解的方式比较多,暴力穷举、辗转相除法、更相减损法、Stein算法算法
此处主要介绍:辗转相除法
思路:
例子:18和24的最大公约数
第一次:a = 18 b = 24 c = a%b = 18%24 = 18
循环中:a = 24 b=18
第二次:a = 24 b = 18 c = a%b = 24%18 = 6
循环中:a = 18 b = 6
第三次:a = 18 b = 6 c=a%b = 18%6 = 0
循环结束
此时b中的内容即为两个数中的最大公约数。
*/
int main()
{
int a = 18;
int b = 24;
int c = 0;
while(c=a%b)
{
a = b;
b = c;
}
printf("%d\n", b);
return 0;
}
6.求一个数除以9的商等于它各位数字的平方和
从键盘输入两个正整数m和n(m和n是三位数),输出m到n之间满足如下条件的数:该数除以9的商等于它各位数字的平方和。例如:224,它除以9的商为24,而22+22+42=24。
【输入形式】
输入仅一行,输入两个正整数m和n(m和n是三位数),两个数用空格分开。
【输出形式】
输出多行,输出相应结果,一个数一行。
【样例输入】
325 700
【样例输出】
453
535
561
635
661
#include <stdlib.h>
#include<stdio.h>
int main()
{
int x, y, i, s;
int a, b, c, d;
scanf("%d%d", &x, &y);
for (i = x;i <= y; i++)
{
s = i / 9;
a = i / 100;//得到百位数
b = i / 10 % 10;//得到十位数
c = i % 10;//得到个位数
d = a * a + b * b + c * c;
if (s == d)
printf("%d\n", i);
}
return 0;
}
五.循环结构(二)
1.求所有含6的整数的和
计算1~n(n为大于1且小于1000的整数)以内的所有含6的整数的和。
【输入形式】
输入仅一行,输入n的值(整型)。
【输出形式】
输出仅一行,输出所有含6的整数的和sum。
【样例输入】
120
【样例输出】
sum=1311
#include <stdio.h>
#include <stdlib.h>
int containsSix(int num)//函数定义,函数定义是一种特殊的函数声明。用整形数字接受传过来的值
{
while (num > 0)
{
if (num % 10 == 6)//含6的整数可以通过判断最后一位是否是6,将原值除10,依次判断
{
return 1;
}
num /= 10;
}
return 0;
}
int main()
{
int n;
int sum = 0;
scanf("%d", &n);
if (n <= 1 || n >= 1000)
{
return 1;//这一步一般可以省略,这里意思是题目要求了n的范围,指定一个范围若输入的值在范围内则返回1,程序还会继续向下。
}
int i;
for( i = 1; i <= n; i++)
{
if (containsSix(i))//这里可以将判断过程封装成一个函数,也可以写在一个主函数中。
{
sum += i;
}
}
printf("sum=%d\n", sum);
return 0;
}
2.任意输入n个数,输出最大和最小值及对应的序号
编一程序,对于任意输入的n个整数,可输出其中的最大数和最小数,并输出它们在序列中的位置序号。
【输入形式】
输入第一行:输入n值。 输入第二行:输入n个整数。
【输出形式】
输出仅二行 第一行:输出最大值和最小值 第二行:输出最大值序列号和最小值序列号。
【样例输入】
4
78 98 88 97
【样例输出】
max=98,min=78
maxi=2,mini=1
#include <stdio.h>
int main()
{
int n = 0;//总共多少个数字
scanf("%d", &n);
char ch[50];//定义一个数组
for (int p = 0; p < n; p++)//数组下标从'0'开始,所以循环变量从0开始计算,在n-1结束
scanf("%d", &ch[p]);//利用for循环不断输入数组中
int max, min, maxi, mini;//分别定义最大值,最小值,最大值下标,最小值下标
max = ch[0];//假设最大值是第一个数
min = ch[0];//同样假设最小值
maxi = 1;//最大值序号,注意,序号和下标不是一个东西!!!
mini = 1;//最小值序号
for (int i = 0; i < n; i++)//这里也要满足i < n,从0开始,到n的前一项结束
{
if (ch[i] > max)
{
max = ch[i];
maxi = 1 + i;
}
if (ch[i] < min)
{
min = ch[i];
mini = 1 + i;
}
}
printf("max=%d,min=%d\nmaxi=%d,mini=%d", max, min, maxi, mini);
return 0;
}
3.大小写字母转换
将输入字符序列ABCdef变换,大写转换为小写,小写转换为大写输出。
【输入形式】
输入仅一行,输入字符序列
【输出形式】
输出仅一行,字符转换。大写变小写,小写变大写,其它字符不变
【样例输入】
ABC&d#ef
【样例输出】
abc&D#EF
#include<stdio.h>
int main()
{
int i;
char a[100];
gets(a);//这里也可以用scanf来输入
for(i=0; a[i]!='\0'; i++)//字符串结尾的标志是\0,所以循环条件是!=\0
if(a[i]>='A' && a[i]<='Z')//这里本质是对于字符ASCII码值的判断
a[i] += 32;
else if(a[i]>='a' && a[i]<='z')
a[i] -= 32;
puts(a);//同理可以printf输出
return 0;
}
4.打印“完数”
编写程序,完成打印1000以内所有的完数。 完数:该数的各因子之和正好等于该数本身 例如:6=1+2+3 28=1+2+4+7+14 所以: 6、28都是完数。 对于一个整数m,如何判断它是否完数? 从数学知识可以知道,一个数m的(除该数本身外)所有因子都在1~m/2之间。 算法中要取得因子之和,只要在1~m/2之间找到所有整除m的数,将其累加起来即可。 如果累加和与m本身相等,则说明m是一个完数,将m输出。
【输入形式】
输入仅一行,输入2 个正整数m 和n(m≥1,n≤1000)
【输出形式】
输出m ~n 之间的所有完数 输出多行:每行1个完数 。
【样例输入】
1 100
【样例输出】
6
28
#include <stdio.h>
int main()
{
int min,max,i,j,sum;
scanf("%d%d",&min,&max);//用min max 限制范围
for(i=min;i<=max;i++)
{
sum=0;
for(j=1;j<=i/2;j++)//从数学知识可以知道,一个数m的(除该数本身外)所有因子都在1~m/2之间
{
if(i%j==0)
sum+=j;
}
if(i==sum)
printf("%d\n",i);
}
return 0;
}
5.
#include <stdio.h>
int main()
{
int a, n;
scanf("%d %d", &a, &n);
int Sn = 0;
int term = 0;
int i;
for ( i = 1; i <= n; i++)
{
term = term * 10 + a; // 计算每一项
Sn += term; // 累加到Sn
}
printf("Sn=%d\n", Sn);
return 0;
}
6.求一个分数序列的值
有一分数序列 2/1,3/2,5/3,8/5,13/8,21/13… 即:后一项的分母为前一项的分子,后项的分子为前一项的分子与分母之和,编程求该数列的前n项之和。 n从键盘输入。
【输入形式】
输入仅一行,输入n值。
【输出形式】
输出前n项分数序列的和。
【样例输入】
3
【样例输出】
sum=5.166667
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
double sum = 0;
double a = 2;
double b = 1;
double temp;
int i;
for ( i = 1; i <= n; i++)
{
sum += a / b;
temp = a;
a = a + b;//后项的分子为前一项的分子与分母之和
b = temp;//后一项的分母为前一项的分子,
}
printf("sum=%.6f\n", n, sum);
return 0;
}
7.输出同构数
编一程序,输出2~999之间的所有同构数。 所谓同构数是指这样的数,它出现在它的平方的右侧,如5的平方=25,25的右端是5,所以5是一个同构数。
【输入形式】
输入仅一行,输入2个整数,比如2和 9
【输出形式】
输出多行,分行输出2到9之间的所有的同构数。
【样例输入】
2 9
【样例输出】
5
6
#include <stdio.h>
int S(int num)
{
int square = num * num;//判断这个数是不是同构数,先得出其平方
while (num > 0)
{
if (num % 10 != square % 10)//如果不是则程序终止
return 0;//if只控制这一条语句
num /= 10;
square /= 10;
}
return 1;
}
int main()
{
int start, end;
scanf("%d %d", &start, &end);
if (start < 2 || end > 999 || start > end) //确定范围
{
return 1;
}
int i;
for ( i = start; i <= end; i++)
{
if (S(i))//判断如果是同构数则打印
printf("%d\n", i);
}
return 0;
}