通信
1.进制转换
(1)十进制数转换为其他进制数
一个十进制正整数m转换成r进制数的思路是,将m不断除以r取余数,直到商为0时止,以反序输出余数序列即得到结果。
注意,转换得到的不是数值,而是数字字符串或数字串。
例如,任意读入一个十进制正整数,将其转换成二至十六任意进制的字符串。
#include <stdio.h>
int main(){
int Type,a,b[10],i=0,c=0;
printf("请输入转换类型:1、十进制转二进制,2、二进制转十进制\n");
scanf("%d",&Type);
printf("请输入原数据");
scanf("%d",&a);
switch(Type)
{
case 1 :
while(a!=0){
b[i]=a%2;
a/=2;
i++;
}
printf("二进制位:");
i--;
//反序输出余数序列
for(;i>=0;i--)
printf("%d ",b[i]);
printf("\n");
break;
case 2 :
while(a!=0){
b[i]=a%10;
a/=10;
i++;
}
i--;
for(;i>=0;i--)
c=c*2+b[i];
printf("十进制为:%d\n",c);
break;
}
}
参考:http://blog.csdn.net/lcj8/article/details/2174147
#include <stdio.h>
int main()
{
int num,a[100],i=0;
printf("输入想要转换的10进制数:");
scanf("%d",&num);
printf("\n转换成16进制数后是:");
do{
a[i]=num%16;
num=num/16;
i++;
}while(num);
i--;
for (;i>=0;i--){
if(a[i]>=10){
a[i]+=55;
printf("%c",a[i]);
}else{
printf("%d",a[i]);
}
}
printf("\n");
return 0;
}
(2)其他进制数转换为十进制数
其他进制整数转换为十进制整数的要领是:“按权展开”,例如,有二进制数101011,则其十进制形式为1×25+0×24+1×23+0×22+1×21+1×20=43。若r进制数an……a2a1(n位数)转换成十进制数,方法是an×r n-1+……a2×r1+a1×r0。
注意:其他进制数只能以字符串形式输入。
例:任意读入一个二至十六进制数(字符串),转换成十进制数后输出。
2.矩阵转置
矩阵转置的算法要领是:将一个m行n列矩阵(即m×n矩阵)的每一行转置成另一个n×m矩阵的相应列。
例:将以下2×3矩阵转置后输出。
即将
1 2 3
4 5 6
转置成
1 4
2 5
3 6
#include <stdio.h>
#define M 3
#define N 4
int main(){
int a[M][N]={0},b[N][M]={0};
int i,j;
for(i=0;i<M;i++)
for(j=0;j<N;j++)
scanf("%d",&a[i][j]);
for(i=0;i<M;i++){
for(j=0;j<N;j++)
printf("%d ",a[i][j]);
printf("\n");
}
for(i=0;i<M;i++)
for(j=0;j<N;j++)
b[j][i]=a[i][j];
for(i=0;i<N;i++){
for(j=0;j<M;j++)
printf("%d ",b[i][j]);
printf("\n");
}
}
3.字符处理
(1)字符统计:对字符串中各种字符出现的次数的统计。
例:任意读入一个只含小写字母的字符串,统计其中每个字母的个数。
参考:http://blog.csdn.net/cyuyanenen/article/details/51736607
for (i = 0; i < strlen(str); i++)
if (str[i] >= 'a' && str[i] <= 'z')
lowAlpha++;
else if (str[i] >= 'A' && str[i] <= 'Z')
upAlpha++;
else if (str[i] >= '0' && str[i] <= '9')
num++;
#include <stdio.h>
int main()
{
int a[100]={0},i;
char c;
while((c=getchar())!='\n'){
for(i=65;i<=90;i++)
//大写字母加32为对应小写字母
if(c==i+32)
a[i]++;
}
for(i=65;i<=90;i++)
if(a[i]>0)
printf("%c:%d\n",i+32,a[i]);
}
(2)字符加密
例如、对任意一个只含有英文字母的字符串,将每一个字母用其后的第三个字母替代后输出(字母X后的第三个字母为A,字母Y后的第三个字母为B,字母Z后的第三个字母为C。)
参考:http://blog.csdn.net/liuhui_8989/article/details/13398793
#include <stdio.h>
#include <string.h>
#define MAX_LENGTH 20
int main()
{
int nlen = 0,i;
char words[MAX_LENGTH] = {};
scanf("%s", words);//读入字符串
nlen = strlen(words);
if (nlen > 0 && nlen <= MAX_LENGTH)
printf("input: %s\n", words);
else
{
printf("input words too long!\n");
return -1;
}
for(i = 0; i < nlen; i++)
{
//所有都加3,当超过'z'的值后,减去26
if (words[i] >= 'a' && words[i] <= 'z')
{
words[i] += 3;
if (words[i] > 'z')
words[i] -= ('z' - 'a'+1);
}
if (words[i] >= 'A' && words[i] <= 'Z')
{
words[i] += 3;
if (words[i] > 'Z')
words[i] -= ('Z' - 'A'+1);
}
}
printf("output: %s\n", words);
return 0;
}
4.整数各数位上数字的获取
算法核心是利用“任何正整数整除10的余数即得该数个位上的数字”的特点,用循环从低位到高位依次取出整数的每一数位上的数字。
例1、任意读入一个5位整数,输出其符号位及从高位到低位上的数字。
参考:http://blog.csdn.net/yuliu0552/article/details/6649312/
#include <stdio.h>
#define MAX 10
int main(){
int a,i=0;
int b[MAX]={0};
scanf("%d",&a);
if(a>=0){
printf("+");
}else{
printf("-");
a=(-a);
}
while(a){
b[i]=a%10;
a/=10;
i++;
}
i--;
for(;i>=0;i--){
printf("%d",b[i]);
}
}
例2、任意读入一个整数,依次输出其符号位及从低位到高位上的数字。
[分析]此题读入的整数不知道是几位数,但可以用以下示例的方法完成此题:
例如读入的整数为3796,存放在x中,执行x%10后得余数为6并输出;将x/10得379后赋值给x。再执行x%10后得余数为9并输出;将x/10得37后赋值给x……直到商x为0时终止。
例3、任意读入一个整数,依次输出其符号位及从高位到低位上的数字。
[分析]此题必须借助数组将依次求得的低位到高位的数字保存后,再逆序输出。