1 实验3_7_数字拆分 (100 分)
已知一个正整数n,n的范围是1—999999999。你的任务是把这个整数分解为单个数字,然后从左至右依次打印出每一个数字。例如将整数“12345”分解,得到“1 2 3 4 5”。
输入格式:
只有一个正整数。测试用例保证合法。
输出格式:
只有一行,为输入整数的拆分结果,相邻两个数字之间有一个空格,最后一个数字后是换行符。例如12345的拆分结果为:1 2 3 4 5。
输入样例:
12345
输出样例:
1 2 3 4 5
#include<stdio.h>
int main()
{
int i,n=0,len=1,s=1,t;
scanf("%d",&n);
t=n;
while(n/10!=0)
{
s*=10;
len+=1;
n/=10;
}
for(i=1;s!=1;s/=10)
{
i=(t/s)%10;
printf("%d ",i);
i=1;
}
i=(t/s)%10;
printf("%d\n",i);
}
//20220112
#include <stdio.h>
int main(){
int num,ln=1,try=10,storage[11]={0};
scanf("%d",&num);
//算位数
while (num/try!=0){
if(num/try!=0) {
ln++;
try *= 10;
}
}
//放进数组
for (int i = ln; i > 0; --i) {
storage[i-1]=num%10;
num/=10;
}
//依次输出
for (int i = 0; i < ln-1; ++i) {
printf("%d ",storage[i]);
}
printf("%d\n",storage[ln-1]);
}
2 实验3_8_位数对调 (100 分)
已知一个正整数n(可以用int存储),你的任务是将n的最低位与最高位上的数字对调,次低位与次高位上的数字对调,以此类推,直到中间位。最后得到一个新整数并将新的数字输出。需要注意的是:如果当最低位数字与最高位数字对调后,数字的长度变短(也就是最低位为0),则不能对这个数进行位数对调处理。
输入格式:
只有一个正整数,即n。
输出格式:
当n可以进行数字对调时,例如n=123,你应输出“321”;当n不可以进数字对调时,例如n=980,你应输出“The number cannot be changed.”。
输入样例:
1365
输出样例:
5631
#include<stdio.h>
int main()
{
int num,i,t,len=0,m;
scanf("%d",&num);
t=num;
while(num)
{
len++;
num/=10;
}
if(t%10==0)
printf("The number cannot be changed.");
else
{
for(i=1;i<len;i++)
{
m=t%10;
printf("%d",m);
t/=10;
}
m=t;
printf("%d\n",m);
}
}
3 实验3_9_符合要求的数字 (100 分)
已知一个整数n,打印1到n所有除以m后所得商正好是它的各个数字平方和的数。
输入格式:
为两个用空格分隔的整数,它们依次代表n、m(1<m,n<10000)。
输出格式:
按从小到大的顺序依次输出所有满足条件的整数,每个数占一行。测试用例保证有满足条件的数。
输入样例:
1000 11
输出样例:
131
241
324
550
624
803
900
910
#include<stdio.h>
int main()
{
int n,m,t,s=1,len=1,i,a,b,c,d;
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++)
{
len=1;
t=i;
while((t/10)!=0)
{
len++;
t=t/10;
}
if(len==1)
{
a=i;
if(a*a==i/m)
printf("%d\n",i);
}
if(len==2)
{
a=i%10;
b=i/10;
if(a*a+b*b==i/m)
printf("%d\n",i);
}
if(len==3)
{
a=i%10;
b=(i/10)%10;
c=i/100;
if(a*a+b*b+c*c==i/m)
printf("%d\n",i);
}
if(len==4)
{
a=(i%10);
b=(i/10)%10;
c=(i/100)%10;
d=i/1000;
if(a*a+b*b+c*c+d*d==i/m)
printf("%d\n",i);
}
}
}
4 实验3_10_同构数 (100 分)
所谓“同构数”是指这样的数,它出现在它的平方数的右边,例如5的平方数是25, 25的平方数是625,所以5和25都是同构数。你的任务是判断整数x是否是同构数。若是同构数,输出“Yes”,否则输出“No”。x的取值范围是(1<=x<=10000),如果输入的x不在允许范围内,则输出错误提示信息“x out of range”。
输入格式:
只有一个整数。测试用例保证所有输入可以用int存储。
输出格式:
只有一行,为判断结果。
输入样例:
20000
输出样例:
20000 out of range
#include<stdio.h>
int main()
{
int num,square,s=10,t,len=1,compare=0;
scanf("%d",&num);
t=num;
if(1<=num&&num<=10000)
{
while((t/10)!=0)
{
len++;
t/=10;
s*=10;
}
square=num*num;
compare=square%s;
if(compare==num)
{
printf("Yes\n");
}
else
printf("No\n");
}
else
{
printf("%d out of range\n",num);
}
}
5 实验3_11_鸡兔同笼吗? (100 分)
鸡有一个头两条腿,兔子有一个头4条腿,蜻蜓有一个头6条腿。没有例外。一个笼子里共有m个头,n条腿,问鸡、兔和蜻蜓各有多少?
输入格式:
只有一行,为两个正整数m和n,分别代表头的个数和腿的个数数。
输出格式:
有若干行,每一行为一组解,格式均为用空格分隔的三个整数,依次代表鸡的个数、解兔子的个数和蜻蜓的个数。多组解的输出顺序按解鸡的个数小到大排序。 测试数据保证可以用int存储。
输入样例:
15 40
输出样例:
在这里给出相应的输出。例如:
10 5 0
11 3 1
12 1 2
//假定ch是已知量,则两个方程,剩下两个未知数可以解出来,所以只穷举ch即可
#include<stdio.h>
int main()
{
int ch=0,rh=0,dh=0,m=0,n=0;
scanf("%d %d",&m,&n);
for(ch=0;ch<=m;ch++)
{
dh=0;
rh=0;
rh=3*m-2*ch-n/2;
dh=m-ch-rh;
if(dh>=0&&rh>=0)
{
printf("%d %d %d\n",ch,rh,dh);
}
}
}
//直接对3个变量都进行穷举
#include <stdio.h>
int main(){
int headNumber,footNumber;
scanf("%d%d",&headNumber,&footNumber);
for (int chicken = 0; chicken <= headNumber; ++chicken) {
for (int rabbit = 0; rabbit <= headNumber-chicken; ++rabbit) {
for (int fly = 0; fly <= headNumber-chicken-rabbit; ++fly) {
if ((chicken+rabbit+fly == headNumber)&&(2*chicken+4*rabbit+6*fly == footNumber)){
printf("%d %d %d\n",chicken,rabbit,fly);
}
}
}
}
}
6 实验3_12_上机考试 (100 分)
计算导论与程序设计某次上机考试共出了4道题,其中每名同学都至少做对了一道题。根据已知条件求做对了2、3、4题的可能的人数。。
输入格式:
只有一行,为两个用空格分隔的正整数m和n,分别代表参加考试的总人数和总的解题数。
输出格式:
有若干行,每一行为一组解,格式均为用空格分隔的三个整数,依次代表解2题的人数,解3题的人数和解4题的人数。多组解的输出顺序按解2题人数由小到大排序,如果解2题的人数相同则按解3题的人数由小到大排序。所有测试数据保证可以用int存储。
输入样例:
15 20
输出样例:
0 1 1
1 2 0
2 0 1
3 1 0
5 0 0
#include<stdio.h>
int main()
{
int m,n,on,tw,th,fo;
scanf("%d %d",&m,&n);
for(tw=0;tw<=m;tw++)
{
th=0;
for(th=0;th<=m-tw;th++)
{
if((n-m-tw-2*th)%3==0)
{
fo=(n-m-tw-2*th)/3;
on=m-tw-th-fo;
if(on>=0&&fo>=0)
printf("%d %d %d\n",tw,th,fo);
}
}
}
}