- 害死人不偿命的(3n+1)猜想
问题描述:对任何一个自然数n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把(3n+1)砍掉一半。这样一直反复砍下去,最后一定在某一步得到n=1.
要求:给定一个不超过1000的正整数n,需要多少步才能得到n=1?
输入样例:3
输出样例:5
#include <stdio.h>
int main(){
int n,count=0 ;
scanf("%d",&n);
while(n!=1){
if(n%2==0){
n/=2;
count++;
}
else{
n = (3*n+1)/2;
count++;
}
}
printf("%d",count);
return 0;
}
问题描述:在第1行给出不超过10的5次方的正整数N,即参赛人数。随后N行,每行给出一位参赛者的信息和成绩,包括其说代表学校的编号(从1开始连续编号)及比赛成绩(百分之),用空格分隔.
要求:在一行中给出总得分最高的学校的编号及其总分,中间以空格分隔。题目保证答案唯一
输入样例:
输出样例:2 150
#include <stdio.h>
#include <string.h>
int main(){
int n,schid,score;
scanf("%d",&n); // 参赛人数
int a[n];
memset(a,0,sizeof(a));
for(int i=n;i>0;i--){ // 循环输入
scanf("%d %d",&schid,&score);
a[schid] += score;
}
int max = 0;
for(int i=0;i<n;i++){ // 求出最大的总分
if(a[i]>=max)
max = a[i];
}
for(int i=0;i<n;i++){ // 定位最大总分对应的学校编号
if(a[i]==max)
printf("%d %d\n",i,max);
}
}
- 查找元素
问题描述:输入一个数n(1<=n<=200),然后输入n个数值各不相同的数,再输入一个值x,输出这个值在这个数组中的下标(从0开始,若不在数组中则输出-1)
要求:
输入样例:
4
1 2 3 4
3
输出样例:2
#include <stdio.h>
int main(){
int n;
scanf("%d",&n); // 输入数组大小
int a[n];
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
int x;
scanf("%d",&x); //输入要查找的元素
int i;
for(i=0;i<n;i++){
if(a[i]==x){
printf("%d",i);
break;
}
}
if(i==n)printf("%d",-1);
return 0;
}
- 图形输出
问题描述:在一行中给出正方形边长N(3<=N<=20)和组成正方形边的某种字符C,间隔一个空格。
要求:由给定字符C画出的正方形。但是注意到行间距比列间距大,所以为了让结构哦看上去更像正方形,所输出的行数实际上是列数的50%
输入样例:10 a
输出样例:
aaaaaaaaaa
a a
a a
a a
aaaaaaaaaa
#include <stdio.h>
int main(){
int row,col;
char c;
scanf("%d %c",&col,&c);
if(col%2==1) row = col/2 + 1;
else row = col / 2;
//第一行
for(int i=0;i<col;i++){
printf("%c",c);
}
printf("\n");
// 第2~row-1行
for(int i=2;i<row;i++){
printf("%c",c);
for(int j=0;j<col-2;j++){
printf(" ");
}
printf("%c\n",c);
}
//第row行
for(int i=0;i<col;i++){
printf("%c",c);
}
return 0;
}
- 日期处理
问题描述:有两个日期,求两个日期之间的天数,如果两个日期是连续的,则规定它们之间的天数为两天,有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD
要求:每组数据输出一行,即日期差值
输入样例:20130101
20130105
输出样例:5
#include <stdio.h>
bool isLoop(int y){ // 判断是否为闰年
return (y%4==0&&y%100!=0)||(y%400==0);
}
int main(){
int first,second,temp;
scanf("%d",&first);
scanf("%d",&second);
if(first>second){
// 使第一个日期早于第二个日期
temp = second;
second = first;
first = temp;
}
// 区别闰年与平年日期
int month[13][2]={{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},
{30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}};
// 获取年月日
int y1,m1,d1,y2,m2,d2;
y1 = first/10000;
y2 = second/10000;
m1 = first%10000/100;
m2 = second%10000/100;
d1 = first%100;
d2 = second%100;
int ans = 1;//记录日期差
while(y1<y2||m1<m2||d1<d2){
d1 += 1;
if(d1>month[m1][isLoop(y1)]){
m1 += 1; //月份加一
d1 = 1; //天数置为一
}
if(m1>12){
y1 += 1; // 年份加一
m1 = 1; // 月份置为一
}
ans += 1;
}
printf("%d\n",ans);
return 0;
}
- 进制转换
问题描述:输入两个非负十进制数A和B(<=2的30次方-1)以及D(进制数),输出A+B的D进制数
要求:在一行中依次给出三个整数A、B和D(进制数)
输入样例:123 456 8
输出样例:1103
#include <stdio.h>
#include <string.h>
int main(){
int a,b,d;
scanf("%d %d %d",&a,&b,&d); // 输入两个非负整数和D进制数
int sum = a + b;
// 将sum转换为D进制数
int result[10];
memset(result,0,sizeof(result));
int i = 0;
do{
result[i++] = sum % d;
sum = sum / d;
}while(sum!=0);
// 从高位到低位输出
for(int k=9;k>=0;k--)
printf("%d",result[k]);
return 0;
}
- 字符串处理
问题描述:读入一串字符,判断是否是“回文串”。“回文串”是一个正读和反读都一样的字符串,比如“level”或者"noon"就是回文串
要求:一行字符串,长度不超过255.如果是“回文串”,输出“Yes”,否则输出“No”
输入样例:12321
输出样例:Yes
#include <stdio.h>
#include <string.h>
int main(){
char str[255];
scanf("%s",&str);
int num = strlen(str);
int count = 0;
for(int i=0;i<num/2;i++){
if(str[i]==str[num-1-i])
count++;
}
if(count==(num/2))
printf("%s","Yes");
else
printf("%s","No");
return 0;
}
- 说反话
问题描述:给定一句英语,要求编写程序,将句中所有单词按颠倒顺序输出。
要求:测试输入包含一个测试用例,在一行内给出长度不超过80的字符串。字符串由若干个单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用1个空格分开,输入保证句子末尾没有多余的空格。每个测试用例的输出占一行,输出倒序后的句子
输入样例:Hello World Here I Come
输出样例:Come I Here World Hello
#include <stdio.h>
int main(){
int num = 0;
char ans[80][80];
// 注意小黑窗的时候要Ctrl+Z,在Enter键
while(scanf("%s",ans[num])!=EOF){
num ++;
}
// 倒着输出单词即可
for(int i=num-1;i>=0;i--){
printf("%s",ans[i]);
if(i>0) printf("%c",' ');
}
return 0;
}
#include <stdio.h>
#include <string.h>
int main(){
char str[90];
gets(str);
int len = strlen(str);
char ans[90][90];
int row=0,col=0;
for(int i=0;i<len;i++){
if(str[i]!=' ') //如果不是空格,则存放至ans[row][col],并令col++
ans[row][col++] = str[i];
else{ //如果是空格,则说明一个单词结束。行row增加1,列col恢复至0
ans[row][col]='\0'; // 末尾是结束符\0 (不加好像也没事)
row ++;
col = 0;
}
}
for(int i=row;i>=0;i--){ //倒着输出单词即可
printf("%s",ans[i]);
if(i>0)printf("%c",' ');
}
return 0;
}