数值类型
1、进制转换
1.1 十进制转换为其他进制
辗转相除法:
- 先将原数除以目标进制,得到商和第一个余数,第一个余数即为目标进制下的数的最低位;
- 将商继续除以目标进制,得到新的商和余数,余数即为目标进制下的次低位;
- 依次类推,直到商为0为止;
- 将余数从低位到高位排列起来即可得到目标进制下的数(最先得到的余数应放在目标进制数的最低位)。
#include<stdio.h>
void convert(int n, int radix)
{
int quotient = n;
int remainder;
int result[100];//存储转换后的数
int i = 0;
//辗转相除,得到各位上的数字
while (quotient != 0)
{
remainder = quotient % radix;//得到余数
result[i++] = remainder;
quotient = quotient / radix;//将商作为新的原数
}
//反转结果,得到正确的顺序
for (int j = i - 1; j >= 0; j--)
{
if (result[j] < 10)
{
//如果是0-9的数字,直接输出
printf("%d", result[j]);
}
else
{
//如果是10-15的数字,输出对应的字母
printf("%c", result[j] - 10 + 'A');
}
}
}
int main()
{
int n, radix;
printf("请输入一个十进制数:");
scanf("%d", &n);
printf("请输入要转换的进制:");
scanf("%d", &radix);
convert(n, radix);
printf("\n");
return 0;
}
1.2 其他进制转换为十进制
方法:
- 从该数的最低位开始,将每一位数字乘以对应的权值;
- 然后将这些乘积相加得到十进制数。
例如:八进制数3524
3 ✖ 8^3 + 5 ✖ 8^2 + 2 ✖ 8^1 + 4 ✖ 8^0 = 3 ✖ 512 + 5 ✖ 64 + 2 ✖ 8 + 4 ✖ 1 = 1876
int main()
{
int octal, decimal = 0, base = 1;
//读入八进制数
printf("请输入一个八进制数:");
scanf("%d", &octal);
//将八进制数转换为十进制数
while (octal != 0)
{
int digit = octal % 10;
decimal += digit * base;
base *= 8;
octal /= 10;
}
printf("转换后的十进制数为:%d\n", decimal);
return 0;
}
2、整除
计算并输出k以内最大的10个能被13或17整除的自然数之和:
int main()
{
int k, i, count = 0, sum = 0;
printf("请输入一个正整数k:");
scanf("%d", &k);
for (i = k; i>0 && count < 10; i--)//要求最大的,i应该从k开始
{
if (i % 13 == 0 || i % 17 == 0)
{
count++;
sum += i;
}
}
printf("k以内最大的10个能被13或17整除的自然数之和为:%d\n", sum);
return 0;
}
2、关于数字的分解与组合
2.1 将a、b中的两个正整数合并形成一个新的整数放到c中:
int main()
{
int a, b, c = 0, digit, digits[20], i = 0;
printf("请输入一个正整数a:");
scanf("%d", &a);
printf("请输入另一个正整数b:");
scanf("%d", &b);
//将输入的两个正整数按位拆分并存储在数组中
while (a > 0)
{
digit = a % 10;//取a的个位数
digits[i++] = digit;//将个位数存储到数组中,同时增加循环计数器的值
a /= 10;//将a除以10,去掉个位数
}
while (b > 0)
{
digit = b % 10;//取b的个位数
digits[i++] = digit;//将个位数存储到数组中,同时增加循环计数器的值
b /= 10;//将b除以10,去掉个位数
}
//将数组中的数字按位拼接成一个新的整数
for (int j = i - 1; j >= 0; j--)
{
//最后取出来的为最高位
//从数组的最高位开始循环,到最低位结束
c = c * 10 + digits[j];
//将c乘以10,再加上当前数组元素的值,得到拼接后的数字
}
printf("按位拼接后的数字为:%d\n", c);
return 0;
}
2.2 将字符串转换为面值相同的整数
int string_to_int(const char* str)
{
int num = 0;//用于存储转换后的结果
int sign = 1;//用于处理负数的情况
if (*str == '-')//如果字符串的第一个字符是负号
{
sign = -1;//将符号变量设为-1
str++;//将指针后移一位,跳过负号
}
while (*str != '\0')//遍历字符串,直到字符串结尾
{
if (*str < '0' || *str>"9")//如果当前字符不是数字
{
break;//退出循环,停止转换
}
num = num * 10 + (*str - '0');//将当前字符转换为数字,并加到结果中
str++;//将指针后移一位,继续遍历下一个字符
}
return num * sign;//返回转换后的结果乘以符号变量
}
int main()
{
char str[] = "-1234";//定义一个字符串变量
int num = string_to_int(str);
printf("字符串%s转换为整数为%d\n", str, num);
return 0;
}