- 打印九九乘法表
思路:打印这种有规律的列表或者打印沙漏、打印飞机都需要规律的循环打印,直接输出也是可以但是太麻烦。
从1*1到9*9可知道有两层循环,前位循环9次后位循环9位,输出的时候也要注意一下格式。
#include<stdio.h>
int main()
{
int i,j;
for(i=1;i<=9;i++)//注意循环的条件从1到9
{
for(j=1;j<=i;j++)
{
printf("%d*%d=%d ",j,i,i*j);
}
printf("\n");//每行结束要换行
}
return 0;
}
2、 两个数的简单计算器
对2个整数进行加、减、乘、除或求余运算
输入样例1:
-2 / 2
输出样例1:
-1
输入样例2:
3 …… 6
输出样例2:
ERROR
根据题意可知大致分为六种情况,+-*/%和其他符号,一般使用if elseif 语句,但是本题使用switch语句更加快速方便。
#include<stdio.h>
int main()
{
int a,b,e;
char c;
scanf("%d%c%d",&a,&c,&b);//注意输入的格式
switch(c){
case '+':printf("%d",a+b); break;
case '-':printf("%d",a-b); break;
case '*':printf("%d",a*b); break;
case '/':printf("%d",a/b); break;
case '%':printf("%d",a%b); break;
default:printf("ERROR");//不同情况的讨论
}
return 0;
}
3、求整数段和
给定两个整数A和B,输出从A到B的所有整数以及这些数的和。
输出格式: 首先顺序输出从A到B的所有整数,每5个数字占一行。
最后在一行中按Sum = X的格式输出全部数字的和X。
这道题不难,用循环就可以输出并累加,需要注意题的格式。
#include<stdio.h>
int main()
{
int a,b,sum=0,i,t,k=0;
scanf("%d %d",&a,&b);
if(a>b)
{
t=a;
a=b;
b=t;
} //保证a<b
for(i=a;i<=b;i++)
{
k++;//计算输出个数
printf("%5d ",i);
if(k%5==0&&(i!=b))//5个就换行但最后一行刚好输完不用换行
{
printf("\n");
}
sum+=i;
}
printf("\n");
printf("Sum=%d",sum);
return 0;
}
4、个位数统计
输入一个N(100000>N>10000),统计每个数出现的次数
开始我简单粗暴想的是直接用字符串读,getchar读一个累加一次,但操作量实在过大。
#include<stdio.h>
int main()
{
int zero=0,one=0,two=0,three=0,four=0,five=0,six=0,seven=0,eight=0,nine=0;
char c;
c=getchar();//getchar读取一个字符
while(c!='\n'){
if(c=='0') zero++;
else if(c=='1') one++;
else if(c=='2') two++;
else if(c=='3') three++;
else if(c=='4') four++;
else if(c=='5') five++;
else if(c=='6') six++;
else if(c=='7') seven++;
else if(c=='8') eight++;
else if(c=='9') nine++;
c=getchar();//继续读取
}
if(zero>0) { printf("0:%d\n",zero); }
if(one>0) { printf("1:%d\n",one); }
if(two>0) { printf("2:%d\n",two); }
if(three>0) { printf("3:%d\n",three); }
if(four>0) { printf("4:%d\n",four); }
if(five>0) { printf("5:%d\n",five); }
if(six>0) { printf("6:%d\n",six); }
if(seven>0) { printf("7:%d\n",seven); }
if(eight>0) { printf("8:%d\n",eight); }
if(nine>0) { printf("9:%d\n",nine); }
return 0;
}
看起来写了很多,其实就是很多废话。
格式多且不好表达,转念一想可以用数组存储输入输出
#include<stdio.h>
#include<string.h>
int main()
{
char a[1005];
int i,j,arr[10] = { };//从0到9的数字
scanf("%s", a);
int c;
for (i = 0; i < strlen(a); i++)//循环条件读完为止
{
c = a[i] - '0';//c该位的数字
arr[c]++;//对应的哪位累加,更加简便
}
for (j = 0; j < 10; j++)
{
if (arr[j] != 0)//跳出条件
printf("%d:%d\n", j, arr[j]);
}
return 0;
}
这样表达是不是清晰很多了呢?
在打印特定图形中,有这样一些经典的题。
- 打印沙漏
打印沙漏简单来说就是两次循环,上层循环和下层循环。
Eg.比如我要打印三层
***
*
***
显而易见,我们的※和空格都是有规律的,每一层对应的* 空格有规律。
#include<stdio.h>
int main()
{
int n,i,j,k;
scanf("%d",&n);
int c=n/2;
for(i=0;i<c+1;i++){
for(j=0;j<i;j++){
printf(" ");
}
for(j=0;j<n-2*i;j++){
printf("*");
}
printf("\n");
}
for(i=0;i<c;i++){
for(j=0;j<c-1-i;j++){
printf(" ");
}
for(j=0;j<2*(i+1)+1;j++){
printf("*");
}
printf("\n");}
return 0;
}
- 打印回型矩阵
题目描述
给你一个整数n,按要求输出n∗n的回型矩阵
输入描述:
输入一行,包含一个整数n
1=n<=19
输出描述:
输出n行,每行包含n个正整数.
示例1
输入
4
输出
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
#include<stdio.h>
int main(){
int n,a=1,i,j;
int arr[30][30]; //定义二维数组才好改变不同位置的数字
scanf("%d",&n);
int l=0,r=n-1; //l为左边界 r为右边界
while(l<r){
for(i=l;i<=r;i++){ //左边界往右走,写完最上面一行,接着就往下走
arr[l][i]=a;
a++;
}
for(i=l+1;i<=r;i++){ //因为最右上角已经被写了,那么从上到下的的上边界就要加一了
arr[i][r]=a;
a++;
}
for(i=r-1;i>=l;i--){ //最右下角被写,有边界减一,再往左走
arr[r][i]=a;
a++;
}
for(i=r-1;i>l;i--){
arr[i][l]=a;
a++;
}
l++; //走一圈,边界就往里缩一圈,相当于回的改变
r--;
}
if(n%2!=0){ //记得一定要判断n的奇偶,奇数的话,走完最后一圈中心还会有一个空
arr[l][l]=a;
}
for( i=0;i<n;i++){
for(j=0;j<n;j++){
printf("%3d ",arr[i][j]);
}
printf("\n");
}
return 0;
}
- 一些代码的小细节
#include<stdio.h> long long gcd(long long a,long long b); long long lcm(long long a,long long b);//放后面需要前面有函数声明,c语言从前往后读的 int main() { long long a,b,m,n; scanf("%lld %lld",&a,&b); if(a<0||b<0) { printf("Input Error"); } else{ m=gcd(a,b); n=lcm(a,b); printf("%lld %lld",m,n);} return 0; } long long gcd(long long a,long long b) { if(a<b) { long long t; t=a; a=b; b=t; } long long r; while(b!=0) { r=a%b; a=b; b=r; } return a; } long long lcm(long long a,long long b) { return a*b/gcd(a,b); } //定义long long的时候全部都要改成long long 不然就会出错误