编程题中一些值得注意的小技巧

1.把一个整数分解后正序输出:

char stt[][8]={"zero","one","two","three","four","five","six","seven","eight","nine");
while(sum>0){
		ss[k++]=sum%10;
		sum/=10;
	}
	for(int i=k-1;i>=0;i--){
		printf(i==k-1?"%s":" %s",stt[ss[i]]);
	}

注意:①三目运算符?:的使用:
printf(i==k-1?“%s”:" %s",stt[ss[i]]);
意为:如果i=k-1成立,就输出stt[ss[i]]无空格
否则就输出的有空格。
这是一种极为有效的解决“两两间有空格,但最后一个字符后没有空格”的方法。
②这里,我们考虑倒序分解,这是因为倒序比正序分解要简单的多。(正序分解还需要考虑把这个数的位数算出来再用循环反复乘以10)

2.“判断类型”的语句:
例如,判断是否为素数,判断二维数组中是否有重复元素,判断二维数组矩阵是否关于主对角线对称等问题,要求输出的是“YES”或“NO”
这种问题一般采用一个判断变量flag,初始化令其为0或1(看题意),当满足某某条件时将其值改变为1或0,最后输出时if(flag==0)输出…,else 输出…即可。
注:有时可能需要采用break来及时跳出循环(就素数而言,只要可以被一个不为1及本身的数整除就不是素数了)

例题:
题目名称:检验矩阵重复元素

题目描述:编写程序判断任意给定n*n的两维整型数组中是否有相同元素。

输入:第一行输入数组行数n(≤10),第二行随机输入n*n个整数作为数组元素值。

输出:如果数组中有相同元素,则输出YES;否则,输出NO。

样例1:

输入:
3
1 2 3 4 5 6 7 8 9
输出:
NO
样例2:

输入:
3
1 1 2 3 4 5 6 7 8
输出:
YES

#include <stdio.h>
int main(){
	long n,a[101],is=0;
	scanf("%ld",&n);
	for(long i=0;i<n*n;i++){
	scanf("%ld",&a[i]);
	}
	for(long j=0;j<n*n-1;j++){
		for(long k=j+1;k<n*n;k++){
		if(a[k]==a[j]) is=1;
	}
}
if(is==1)printf("YES");
else printf("NO");
return 0;
}

3.“容器”思想(用一个变量暂存需要转换的量)
常见于两个元素a与b的交换(要求输出交换后的情形,即b和a);
推广为二维数组的转置(本质上还是对元素的交换,输出某些元素交换后的二维数组)

例题:
题目名称: 矩阵转置
问题描述: 编写程序,将任意给定n*n的两维整型数组转置。

输入:第一行输入数组行数n(≤10),第二行随机输入n*n个整数作为数组元素值。

输出:按先行后列、从左至右的顺序输出转置后数组内的所有元素,每行n个元素,同一行内的各元素间以一个西文空格间隔;每行最后一个元素除必要的回车换行符外无其它字符。

样例1:

输入:
3
1 2 3
1 2 3
1 2 3
输出:
1 1 1
2 2 2
3 3 3
样例2:

输入:
3
1 1 1
2 2 2
3 3 3
输出:
1 2 3
1 2 3
1 2 3

#include<stdio.h>
int main(){
	int n,a[11][11],b[11][11],x,y,z;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
	scanf("%d",&a[i][j]);
	}
}
	for(x=0;x<n;x++){
		for(y=0;y<n;y++){
		b[x][y]=a[y][x];
		printf("%d",b[x][y]);
	if(y<n-1) printf(" ");
	}printf("\n");
}
return 0;
}

4.重新赋值(常见于多层循环中)
内层循环做完后,参加循环的变量还要参加外层循环中的某些步骤
这时需要考虑将这个变量重新赋值(一般来说是赋值为0或1,需根据题目的具体要求而定)。
也有可能是这个变量在下一步需要改变自己的值,但在下一步的后面还需要调用这个变量的初值。
示例:
第三次实验考试第一题:

for(i=max(k,x)-1,j=max(k,x)-1;i>=0||j>=0;i--,j--){
		r=0;
		r=c[i]+d[j]+m;
		int y=r;
		m=0;
		if(y>=10){
			cnt++;
			m=1;
		}
	}

用一个int类型的变量y来记录r的值,且在这一步之前还需要把r赋为初值0,这是因为r在求和之后如不清0,则在下一轮循环中则会连带着之前的r值一起参与循环。
5.将字符转换为数字:
做法:用字符减去字符‘0’,计算两字符间的距离
例:将字符’0’—'9’转换为整数0—9:

char a;
if(a>='0'&&a<='9'){
	printf("%d",a-'0');
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值