BUPT2021秋季计算导论实验5
数字拆分
/* 实验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 n ;
scanf("%d", &n);
int cnt=0 ;
int m = n;
while (m!= 0)
{
cnt++;
m = m/10 ;
}
//printf("%d", cnt );
int a[9]={0};
int i ;
for ( i =0 ; i<cnt ; i++)
{
a[i]= n%10;
n = n /10;
}
for ( i =cnt-1; i >0 ; i --)//最后输出时,因为要符合pta的输出格式,所以对最后一项单独处理。
{
printf("%d ", a[i]);
}
printf("%d\n", a[i]);
return 0;
}
此处我才用了数组,也可以简单点
while(m >= 10 )
{
int k ;
k = m % 10 ;
printf("%d " , k ) ;
m = m / 10 ;
}
printf("%d" , m ) ;//每次都将个位数输出
位数对调
*7-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 n ;
scanf("%d", &n);
int cnt = 0;
int m = n ;
while (m != 0)
{
cnt++;
m= m /10 ;
}
//printf("%d", cnt);
int i ;
i=n%10 ;
if(i ==0 )
{
printf("The number cannot be changed.");
return 0;
}
else
{
int j = 0;
int p =0 ;
int a[cnt]= {0};
for (;j<cnt ; j++)
{
p = n %10;
a[j]= p;
n = n/10;
}
for ( j = 0 ; j <cnt ; j++ )
{
printf("%d", a[j]);
}
}
return 0;
符合要求的数字
*7-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 Judge (int , int );
int main()
{
int m, n;
scanf("%d %d", &n,&m);
int i ;
for ( i = 1 ; i <= n ; i++ )
{
if(Judge(i,m))
{
printf("%d\n", i);
}
}
return 0;
}
int Judge(int n,int m )
{
int temp= n;
int cnt = 0;
int a[10];
while ( temp != 0)
{
a[cnt++]= temp%10;
temp = temp /10;
}
int yu = n / m;
int sum = 0;
int i ;
for ( i =0 ; i< cnt; i++)
{
sum = sum +a[i]*a[i];
}
if(sum == yu)
{
return 1;
}
else {
return 0;
}
}
同构数
实验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 n ;
scanf("%d", &n);
int s= n *n;
int cnt = 0;
int m = n;
while (m != 0)
{
cnt++;
m = m /10;
}
if((n>10000)||(n<1))
{
printf("%d out of range",n);
}
else
{
int digit = 1;
int i ;
for ( i = 0; i < cnt ;i++)
{
digit= digit *10;
}
int yu= s % digit ;
if(yu == n )
{
printf("Yes");
}
else
{
printf("No");
}
}
return 0 ;
}
鸡兔同笼问题
实验3_11_鸡兔同笼吗? (100 分)
鸡有一个头两条腿,兔子有一个头4条腿,蜻蜓有一个头6条腿。没有例外。一个笼子里共有m个头,n条腿,问鸡、兔和蜻蜓各有多少?
输入格式:
只有一行,为两个正整数m和n,分别代表头的个数和腿的个数数。
输出格式:
有若干行,每一行为一组解,格式均为用空格分隔的三个整数,依次代表鸡的个数、解兔子的个数和蜻蜓的个数。多组解的输出顺序按解鸡的个数小到大排序。 测试数据保证可以用int存储。
输入样例:
15 40
输出样例:
在这里给出相应的输出。例如:
10 5 0
11 3 1
12 1 2
#include<stdio.h>
int main()
{
int m ,n ;
scanf("%d %d", &m, &n);
int head_ji = m /1;;
int head_tu = m /1;
int head_qingting = m/1;
int i , j , k;
for ( i = 0 ; i <= head_ji; i++)
{
for ( j = 0; j <= head_tu ; j++)
{
for ( k = 0; k <= head_qingting ; k ++)
{
if(i + j + k == m)
{
if (2*i + 4*j + 6* k == n )
{
printf("%d %d %d\n",i , j , k );
}
}
}
}
}
return 0;
}
上机考试
实验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 ;
scanf("%d %d", &m ,&n);
int i , j , k;
int s= n-m;
for ( i = 0; i <=m ;i ++)
{
for ( j = 0; j <= m ; j++)
{
for ( k =0 ; k<= m ;k ++)
{
if(i + j + k <= m)
{
if ( i+2*j+3*k== s)
{
printf("%d %d %d\n", i,j,k);
}
}
}
}
}
return 0;
}
这次练习应该是算法练习,应该是回溯法和暴力法QAQ…