第一题
有一分数序列:2/1 3/2 5/3 8/5 13/8 21/13...求出这个数列的前20项之和。
解析:后一个的分子是前一个的分子+分母,分母是上一个的分子
#include <stdio.h>
int main(int argc, const char *argv[])
{
int fenmu=1;
int fenzi=2;
float sum=0;
int a;
for(int i=1;i<=20;i++){
printf("%d/%d\n",fenzi,fenmu);
sum=sum+(fenzi/fenmu);
a=fenmu;//本次的分母
fenmu=fenzi;//下一次的分母=本次分子
fenzi=a+fenzi;//下一次的分子=本次分母+本次分子
}
printf("前二十项的和为%g\n",sum);
return 0;
}
运行结果:
第二题
有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
解析:使用多层循环,每层循环进行值的判断
每一层循环为一位数字,每层循环的值不能相同
#include <stdio.h>
int main(int argc, const char *argv[])
{
int sum=0;
for(int i=1;i<=4;i++){ //百位
for(int j=1;j<=4;j++){ //十位
for(int k=1;k<=4;k++){ //个位
if(i!=j&&j!=k&&k!=i){
printf("%d%d%d ",i,j,k);
sum++;
}
}
}
}
printf("\n");
printf("共%d个数\n",sum);
return 0;
}
运行结果:
第三题
使用嵌套循环产生下列图案,要求用for嵌套循环
F
_FE
__FED
___FEDC
____FEDCB
_____FEDCBA
解析:使用双重循环嵌套
外层控制行数,内层有两个循环,一个控制横线,一个控制字母
字母使用ASCII码字母表来控制(A~F:65~70)
#include <stdio.h>
int main(int argc, const char *argv[])
{
for(int i=1;i<=6;i++){ //控制行数
for(int j=0;j<i-1;j++){ //控制横线
printf("_");
}
for(int k=1;k<=i;k++){ //控制打印出的字母个数
printf("%c",71-k); //控制打印的内容
}
printf("\n");
}
return 0;
}
运行结果:
第四题
打印以下图形
*
***
*****
*******
解析:使用双重for循环
每一行打印的个数都是奇数(2n-1)
#include <stdio.h>
int main(int argc, const char *argv[])
{
for(int i=1;i<=4;i++){
for(int j=1;j<=(2*i)-1;j++){
printf("*");
}
printf("\n");
}
return 0;
}
运行结果:
第五题
打印以下图形。在以下图形的基础上修改,要求从终端输入金字塔层数,打印出对应层数金字塔
*
***
*****
*******
解析:使用双重 for 循环
共 data 行,空格 = 总行数 - 当前行数
每行打印的个数是奇数,为(2n-1)
#include <stdio.h>
int main(int argc, const char *argv[])
{
int data;
printf("请输入需要打印的金字塔层数\n");
scanf("%d",&data);
for(int i=1;i<=data;i++){
for(int j=0;j<=data-i;j++){
printf(" ");
}
for(int k=1;k<=(2*i)-1;k++){
printf("*");
}
printf("\n");
}
return 0;
}
运行结果:
第六题(附加题)
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
若翻转后超出取值范围,则输出0即可。
输入: 123 输出 321
输入: -123 输出-321
解析:32位有符号的整数,为int类型
运行结果:
第七题
定义一个整型数组,容量为5。要求从终端获取5个整形数,存储到该数组中。然后将数组的整型数据输出到终端上
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a[5];
printf("请输入5个整型数字\n");
for(int i=0;i<5;i++){
int data;
scanf("%d",&a[i]);
}
printf("生成的数组为:\n");
for(int i=0;i<5;i++){
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
运行结果:
第八题
从终端输入5个数据,然后再输入一个数据n,判断n是否在5个数据中
解析:基于第七题然后循环中用 if 判断
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a[5];
printf("请输入5个整型数字\n");
for(int i=0;i<5;i++){
int data;
scanf("%d",&a[i]);
}
printf("生成的数组为:\n");
for(int i=0;i<5;i++){
printf("%d ",a[i]);
}
printf("\n");
int data;
int flag=0;
printf("输入一个数判断是否在数组内已存在\n");
scanf("%d",&data);
for(int i=0;i<5;i++){
if(data==a[i]){
flag=1;
break;
}
}
if(flag){
printf("%d已存在\n",data);
}else{
printf("%d不存在\n",data);
}
printf("\n");
return 0;
}
运行结果:
第九题
输入5个正整数,求5个数据中的最大值,及5个数据的和
解析:使用 for 循环生成数组 ,然后使用 for 循环完成累加,寻找最大值,遍历
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a[5];
for(int i=0;i<5;i++){
scanf("%d",&a[i]);
}
printf("形成的数组是:");
int max=a[0];
int temp;
int sum=0;
for(int i=0;i<5;i++){
if(max<a[i]){
max=a[i];
}
sum=sum+a[i];
printf("%d ",a[i]);
}
printf("\n");
printf("最大值是%d\n",max);
printf("5个数据相加等于:%d\n",sum);
return 0;
}
运行结果:
第十题
求斐波那契数列的第20项......,
n=1和n=2的时候都是输出1、1、2、3、5、8、13、21、34、公式: f(n) = f(n-1)+f(n-2);
例如第20项,6765
解析:需要将前两个数据存起来,用于下一次循环
#include <stdio.h>
int main(int argc, const char *argv[])
{
int First=1; //前一项
int Two=1; //前两项
int num;
for(int i=0;i<20;i++){
if(i==0||i==1){
num=1;
}else{
num=First+Two;
Two=First; //前两项=前一项
First=num; //前一项=当前数
}
printf("第%d项:%d\n",i+1,num);
}
return 0;
}
运行结果:
第十一题
先从终端输入一串字符以"n"结尾,然后将这一串字符倒叙输出,同时求出这一串字符的空格个数。
解析:定义一个 char 数组,判断输入 “\n”(回车) 的时候结束输入
输入时累计数组长度,用于后面遍历
将数组遍历翻转输出,同时判断其中是否有 “ ” ,并累加空格个数,输出
#include <stdio.h>
int main(int argc, const char *argv[])
{
char a[100];
int length;
for(int i=0;i<100;i++){
scanf("%c",&a[i]);
length++;
printf("%c",a[i]);
if(a[i]=='\n'){
printf("输入完毕\n");
break;
}
}
int sum=0;
printf("倒序输出:\n");
for(int i=0;i<=length-1;i++){
printf("%c",a[length-1-i]);
if(' '==a[i]){
sum++;
}
}
printf("\n");
printf("空格有%d个\n",sum);
return 0;
}
运行结果:
第十二题
从终端输入一串字符以"n'结尾,求出小写字母的个数,大写字母的个数,数字的个数
解析:小写字母a~z(97~122),大写字母A~Z(65~90),数字 0~9(48~57)
参考第十一题的做法,循环找出小写字母的个数,大写字母的个数,数字的个数
#include <stdio.h>
int main(int argc, const char *argv[])
{
char a[100];
int length=0;
for(int i=0;i<100;i++){
scanf("%c",&a[i]);
length++; //对数组长度计算
if(a[i]=='n'){
printf("输入完毕\n");
break;
}
}
printf("length=%d\n",length);
int sumNum=0;
int sumA=0;
int suma=0;
for(int i=0;i<=length-1;i++){
if(a[i]<=122&&a[i]>=97){ //
suma++;
}
if(a[i]<=90&&a[i]>=65){ //
sumA++;
}
if(a[i]<=57&&a[i]>=48){ //
sumNum++;
}
}
printf("大写字母有%d个\n",sumA);
printf("小写字母有%d个\n",suma);
printf("数字有%d个\n",sumNum);
return 0;
}
运行结果:
第十三题
输入5个正整数,求5个数据中的第二大的值
解析:先求出最大值,挑出最大值,再找出第二大值
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a[5];
printf("输入5个正整数:\n");
for(int i=0;i<5;i++){
scanf("%d",&a[i]);
}
int max=a[0];
int sec=a[0];
int maxIndx;
for(int i=0;i<5;i++){ //找出最大值
if(max<a[i]){
max=a[i];
maxIndx=i;
}
}
for(int i=0;i<5;i++){ // 找出第二大的值
if(sec<a[i]&&i!=maxIndx){ //最大的但是脚标不等于最大值的脚标
sec=a[i];
}
}
printf("第二大的值为:%d\n",sec);
return 0;
}
运行结果:
第十四题
从终端输入一串字符以 ‘\n’ 结尾,求出小写字母个数分别多少个?
例如输入: aabcabd换行,得到a有多少个,b有多少个,c有多少个,d有多少个
解析:小写字母a~z(97~122)
用一个数组来表示a~z,每个字母的数量
#include <stdio.h>
int main(int argc, const char *argv[])
{
char a[100];
int letter[26]={0}; //必须初始化值,不然没有输入的字母就会变成随机数
for(int i=0;i<100;i++){
scanf("%c",&a[i]);
if('\n'==a[i]){
break;
}
}
int asum=0;
int j=0; //记录26个字母的顺序
for(int i=0;a[i]!='\n';i++){
if(a[i]<=122&&a[i]>=97){
asum++;
j=a[i]-97; //代表第几个字母 例如:a=97-97=0 letter[0]
letter[j]++; //第j个字母的累加
}
}
for(int k=0;k<26;k++){
printf("字母%c有%d个\n",97+k,letter[k]);
}
printf("有%d个字母\n",asum);
return 0;
}
运行结果:
第十五题(附加题)
从终端输入一串字符以"n'结尾,实现一个 atoi 函数,使其能将获取到的一串字符转换成整数。要求如下
1) 丢弃开头的空格字符,直到寻找到第一个非空格字符为止
2)如果第一个字符为+-,则将改符号与之后面的数字字符组合起来,形成一个有符号的整数
3)假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成一个整数。
4)该字符串在有效的整数部分之后也可能会存在多余的字符,那么这些字符可以被忽略,它们对函数不应该造成影响。
5)假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时则你的函数不需要进行转换,即无法进行有效转换
6)在任何情况下,若函数不能进行有效的转换时,请返回 0例子:
输出 42输入“42”
输出-42输入“ -42”
输入“1234 abcd”输出 1234
输入“abcd 1234”输出 返回0
输入“-9999999999”输出-2147483648 //超出int的范围
解析:
运行: