c语言入门小问题2

  1. 打印九九乘法表

思路:打印这种有规律的列表或者打印沙漏、打印飞机都需要规律的循环打印,直接输出也是可以但是太麻烦。

从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;
}

这样表达是不是清晰很多了呢?

在打印特定图形中,有这样一些经典的题。

  1. 打印沙漏

打印沙漏简单来说就是两次循环,上层循环和下层循环。

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;
	} 
  1. 打印回型矩阵

题目描述

给你一个整数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;
}
  1. 一些代码的小细节
    #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 不然就会出错误 
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值