答案仅供参考,每周更新,希望能够带来一些不同的启发与思路
有解释的部分直接写注释里,若有不懂欢迎评论留言,看到就会回的
Week 3
T1:
输入若干个整数,其值在0至4的范围内,用-1作为输入结束的标志,统计每个整数的个数。
输入:[0,4]内的整数组成的序列,最后是-1,用空格隔开。
输出:0,1,2,3,4的统计个数,用一个空格隔开(最后一个输出后面没有空格)。
样例:
3 3 3 2 2 1 0 3 4 4 -1
1 1 2 4 2
#include<stdio.h>
int a[10],b[10],n;//a数组用来记录数字,其实可以用单个变量即可,b数组用来记录出现次数,大小理论到4就可以,习惯开大点
int main()
{
n=0;
while(scanf("%d",&a[n]))
{
if(a[n]==-1)
{
break;
}
b[a[n]]++;
}
for(int i=0;i<=4;i++)
{
if(i!=4)
{
printf("%d ",b[i]);
}
else
{
printf("%d",b[i]);
}
}
return 0;
}
T2:
将一个大于4的正整数分解为连续的正整数之和,请显示全部分解结果。
如数字15,可以分解为:
15=1+2+3+4+5
15=4+5+6
15=7+8
#include<stdio.h>
int a,b;
int check(int n)//写个check函数看看能不能正好加起来是a,第一个int代表返回值,第二个int是输入值
{
int now=a;
while(now>0)
{
now=now-n;
n+=1;//n=n+1能看懂吧
}
if(now==0)//刚好能加和
{
return 1;//返回1代表可以
}
else
{
return 0;//代表不行
}
}
int main()
{
scanf("%d",&a);
b=a/2+1;//由观察不难看出要想连续加和等于a,b一定小于a的一半,那么从1开始到a一半加一开始枚举(除2就是边界可以不加一,但我比较求稳这样写的时候比较无脑),这里的除法是向零取整,也就是向下取整
for(int i=1;i<=b;i++)
{
if(check(i)==1)//从i开始连续整数可以加和
{
int now=a,d=i;//这里做一个数据转移记录,保持原始数据a和i不被修改,后面还要用,下面输出修改now与d就行了
printf("%d=",a);
while(now>0)
{
now-=d;
if(now!=0)
{
printf("%d+",d);//注意格式
}
else
{
printf("%d",d);
}
d++;
}
printf("\n");
}
}
return 0;
}
T3:
求a+aa+aaa+aaaa+…+aa...a(n个),其中a为1~9之间的整数。
例如:当a = 1, n = 3时,求1+11+111之和为123;
输入:组成序列的数字a和求和项的数量n
输出:算式和结果。
#include<stdio.h>
int a,n,now=0,ans=0;
int main()
{
scanf("%d%d",&a,&n);
for(int i=1;i<=n;i++)
{
now=now*10+a;//now用来记录当前加数
ans+=now;//ans记录总和
for(int j=1;j<=i;j++)//以下是把加式输出出来,注意格式
{
printf("%d",a);
}
if(i!=n)
{
printf("+");
}
else
{
printf("=%d",ans);
}
}
return 0;
}
T4:
“水仙花数”是指一个三位正整数,其各位数字的立方和刚好等于该数本身,如:153=1^3+5^3+3^3 (其中^表示乘方,5^3表示5的3次方),则153是一个“水仙花数”。
输入n, m,100<=n,m<1000, 求出[n,m]之间的水仙花数。若该区间没有水仙花数,输出-1.
输入:n,m,用空格隔开。
输出:若干水仙花数,用空格隔开(最后一位输出后面无空格)。
#include<stdio.h>
#include<stdbool.h>
int n,m;
int check(int a)//判断函数,返回1是水仙数,2不是
{
int b,c=a,tot=0;//tot记录加到多少,c用来保存a
while(a>0)
{
b=a%10;
a=a/10;
tot+=b*b*b;
}
if(tot==c)
{
return 1;
}
else
{
return 0;
}
}
int main()
{
scanf("%d%d",&n,&m);
bool first=0;//bool类型,需要头文件<stdbool.h> ,一方面对第一个输出数据前面没有空格做判断,另一方面做标志看区间内有没有水仙数
for(int i=n;i<=m;i++)
{
if(check(i)==1)
{
if(first==0)
{
printf("%d",i);
first=1;//第一个水仙数输出完毕改first为1
}
else
{
printf(" %d",i);
}
}
}
if(first==0)//如果没改过,那么就是没有水仙数
{
printf("-1");
}
return 0;
}
T5:
求一组数中的最大值,然后统计该最大值在这组数中出现的次数。
输入:元素个数n和n个整数。n<200。(要先输入个数n,然后再输入n个数)
输出:最大值及出现的次数。数据间以一个逗号隔开。
#include<stdio.h>
int a,b[201],now,n,now_max;//now用来代表当前最大值对应的出现次数,b数组开始均为0(开在主函数外初值均为0),用作统计,now_max用来记录当前最大值
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a);
if(a>now_max)//找到新的最大值
{
now_max=a;//更新最大值
now++;//更新计数数组,重新开始计数
b[now]++;
}
else if(a==now_max)
{
b[now]++;//当前最大值又出现计数加一
}
}
printf("%d,%d",now_max,b[now]);
return 0;
}
T6:
定义包含5个英文单词的字符数组(即二维字符数组),键盘输入5个单词,按字典顺序寻找最大和最小单词并输出。
输入:5个单词
输出:最大和最小单词(按字典序)
如:
one two three four five
max:two min:five(注:max和min后是英文冒号)
#include<stdio.h>
#include<string.h>
char a[500][500];
void qsort(void)//用冒泡排序思想写一个字符串排序(由小到大
{
for(int i=1;i<=4;i++)//冒泡排序,可以去看看csdn具体解释,外层n-1次,内层1到n-i
{
for(int j=1;j<=5-i;j++)
{
if(strcmp(a[j],a[j+1])>0)//strcmp比较字符串函数,前面大返回>0,后面大返回<0,相等=0
{
char c[500];//交换
strcpy(c,a[j]);
strcpy(a[j],a[j+1]);
strcpy(a[j+1],c);
}
}
}
}
int main()
{
for(int i=1;i<=5;i++)
{
scanf("%s",&a[i]);
}
qsort();//排序
printf("max:%s min:%s",a[5],a[1]);//第一个最小 ,最后一个最大
return 0;
}
T7:
将字符串首部的*号全部移到字符串的尾部,中间若有*号,保持中间的*号不动。字符串长度不超过200.
样例:
***street*****music***
street*****music******
#include<stdio.h>
#include<string.h>
char a[1000];
int main()
{
scanf("%s",&a);
int tot=0;
for(int i=0;i<strlen(a);i++)
{
if(a[i]=='*')
{
tot++;//tot记录一下前面有几个*
}
else
{
break;//一旦不连续就终止
}
}
for(int i=tot;i<strlen(a);i++)
{
printf("%c",a[i]);
}
for(int i=1;i<=tot;i++)
{
printf("*");
}
return 0;
}
T8:
从键盘输入一个正整数(>1),然后将该整数分解为1和各个质因子的相乘,如果输入的整数本身就是质数,则应分解为1和该数本身相乘。
如:
18
1*2*3*3
线性筛素数可以看看这里 传送门
#include<stdio.h>
#include<string.h>
int a,b,tot;
int p[500000],ip[500000];//数据不大开500000就够用
void zhishu(void)//这里用到一点线性筛素数算法,可以看看链接,p数组代表质数表,ip是判断数组,判断该数是否为质数
{
tot=1;
ip[0]=0;
ip[1]=0;
for(int i=2;i<=500000;i++)
{
if(ip[i]) p[tot++]=i;
for(int j=1;j<=tot&&i*p[j]<=500000;j++)
{
ip[i*p[j]]=0;
if(i%p[j]==0) break;
}
}
}
int main()
{
scanf("%d",&a);
memset(ip,1,sizeof(ip));//初始化为1,在<string.h>库里
zhishu();
printf("1");
if(ip[a])//是质数
{
printf("*%d",a);
}
else
{
for(int i=1;i<=tot;i++)
{
while(a%p[i]==0)//把所有质因子写出来
{
a=a/p[i];
printf("*%d",p[i]);
}
if(p[i]>a/2+1)//大于一半就不是质因子了,提高运算效率
{
break;
}
}
}
return 0;
}
T9:
有一分数序列如下: 2/1, 3/2, 5/3, 8/5, 13/8, 21/13, … 即后一项的分母为前一项的分子,后项的分子为前一项分子与分母之和,求其前n项之和。
输入:项数n(整数)
输出:前n项之和(实数,注:保留4位小数)
#include<stdio.h>
int n;
int main()
{
double fenzi=2.0,fenmu=1.0,ans=0.0,c;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
ans+=fenzi/fenmu;
c=fenmu;
fenmu=fenzi;
fenzi=c+fenzi;
}
printf("%0.4lf",ans);
return 0;
}
T10:
输入公元年份和月份,输出该月份的天数。
输入:年,月(逗号分隔)
输出:天数
#include<stdio.h>
int n,year,month;
int main()
{
scanf("%d,%d",&year,&month);
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
{
printf("31");
}
else if(month==4||month==6||month==9||month==11)
{
printf("30");
}
else if(month==2&&((year%100!=0&&year%4==0)||(year%100==0&&year%400==0)))
{
printf("29");
}
else printf("28");
return 0;
}