十进制转二进制
#include <stdio.h>
int main() {
int num; int temp; int i = 0;
int arr[20];
printf("请输入一个十进制数:\n");
scanf_s("%d", &num);
do {
temp = num % 2;
num = num / 2;
arr[i++] = temp;
} while (num != 0);
for (int j = i - 1; j >= 0; j--)
printf("%d", arr[j]);
}
#include <stdio.h>
int main() {
int num; int temp; int i = 0;
int arr[20];
printf("请输入一个十进制数:\n");
scanf_s("%d", &num);
while (num != 0){
temp = num % 2;
num = num / 2;
arr[i++] = temp;
}
for (int j = i - 1; j >= 0; j--)
printf("%d", arr[j]);
}
while循环先判断条件是否成立,如果成立则执行循环体,然后再判断条件是否成立,如果成立则再执行循环体,以此类推,直到条件不成立为止。而do while循环先执行一次循环体,然后再判断条件是否成立,如果成立则再执行循环体,以此类推,直到条件不成立为止。因此,do while循环至少会执行一次循环体,而while循环可能不会执行循环体。
十进制转n进制
#include <stdio.h>
# define M 100
void change(int srcnum, int jinzhi)
{
int i = 0, j = 0; // 循环变量
int a[M] = { 0 }; // 全部元素初始化为0
while (srcnum)
{
a[i] = srcnum % jinzhi;
srcnum /= jinzhi;
i++;
}
for (j = i - 1; j >= 0; j--) // 注意:i多加了一次,i-1,一直取到j为0
{
printf("%d", a[j]);
}
printf("\n");
}
int main(void)
{
int source = 0; // 原数字
int jinzhi = 0; // 要转为R进制
char confirm; // 控制是否继续
do
{
printf("请输入原数值: \n");
scanf_s("%d", &source);
printf("请输入转换的进制数: \n");
scanf_s("%d", &jinzhi);
while (getchar() != '\n');
change(source, jinzhi);
printf("想继续输入吗?Y/N: \n");
scanf_s("%c", &confirm);
} while ('Y' == confirm || 'y' == confirm);
//do{}while ();增强人机交互,计算结果后摁'Y' || 'y' 一直玩
return 0;
}
缓冲区:scanf取空格前的东西,getchar啥都取但是是取一个,可能要去除的空格和/n不止一个所以用while (getchar() != '\n')取缓冲区的所有东西《CSDN的:关于getchar的用法及实例解析》
购物单(2017年试题A)取款机只提供100元面额的纸币,根据购物单(一列一大串价格,一列一大串相应的打折)算应该取多少现金
建个记事本,把数据复制到里面,去掉修改汉字,利用freopen来导数据,来写代码
C++版:
#include<iostream>
using namespace std;
float price[100];
int discount[100];
int main() {
int i;
freopen("C:\\Users\\dell\\Desktop\\cost.txt", "r", stdin);
i = 0;
while (cin >> price[i] >> discount[i])
i++;
i = 0;
float sum = 0;
while (price[i] != 0) {
if (discount[i] < 10)
sum += price[i] * discount[i] / 10;
else
sum += price[i] * discount[i] / 100;
i++;
}
cout << sum << endl;
return 0;
}
C语言版:
#include<stdio.h>
int main()
{
freopen("C:\\Users\\dell\\Desktop\\cost.txt", "r", stdin);
int i = 0, c = 0;
float sum = 0, price[100], discount[100];
while (scanf("%f %f", &price[i], &discount[i]) != EOF)//将文件中数据读取到两个数组里面
i++;
while (i--)
{
if (discount[c] < 10)
sum = sum + price[c] * discount[c] / 10;
else
sum = sum + price[c] * discount[c] / 100;
c++;
}
printf("%f", sum);
}
不足:因为面值是100元,所以结尾必须是00结尾,以上两个程序算出来的都是带有小数的具体的刚好的
第几天(2018年试题A)
闰年的计算归结是:四年一闰;百年不闰,四百年再闰
闰月29,else28天
C语言版:
#include <stdio.h>
int main()
{
int two = 0;
if (2000 % 4 == 0 && 2000 % 100 != 0 || 2000 % 400 == 0) {
two = 29;
}
else {
two = 28;
}
int s = 31 + two + 31 + 30 + 4;
printf("%d", s);
return 0;
}
简易版C语言(当面对写不出代码的时候用这种直接手算人处理的办法):
#include<stdio.h>
int main()
{
int s = 31 + 29 + 31 + 30 + 4;
printf("%d", s);
return 0;
}
C++版:
#include <iostream>
using namespace std;
bool leap(int year) {
return (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);
}
int main() {
int two;
if (leap(2000))
two = 29;
else
two = 28;
cout << 31 + two + 31 + 30 + 4 << endl;
return 0;
}
(注意:c语言里没有bool函数!!!)
1.4明码(2018年试题B)16点阵字库是把每个汉字看成16*16个像素信息,并把这些信息记录在字节中,一字节存8位信息,用32字节就可以存储一个汉字的字形了,把每个字节转换为二进制表示,1表示墨迹,0表示底色,每行2字节,一共16行,布局如下:
1 第1字节,第2字节
2 第3字节,第4字节
.......
16 第31字节,第32字节
十行数字(略),每行32个数字,一共隐藏10个汉字
C语言版:
#include <stdio.h>
int main() {
int n, num, offset; //num控制数组行数,2个数字一行
char ch[16][16];
for (int i = 1; i <= 10; i++) {
num = 0; offset = 1;
for (int j = 0; j < 32; j++) {
scanf("%d", &n);
if (n < 0) n = n + 128;
for (int k = 1; k <= 8; k++) {
int mod = n % 2;
n = n / 2;
ch[num / 2][8 * offset - k] = mod+48;
}
num++;
if (num % 2 == 0) offset = 1;
else offset = 2;
}
for (int j = 0; j < 16; j++) {
for (int k = 0; k < 16; k++)
printf("%c", ch[j][k]);
printf("\n");
}
}
return 0;
}
总结:1.汉字是16*16点阵(二进制),1字节(十进制)可以存储8位信息(二进制):
第一字节 第二字节 00001000 10000000
第三字节 第四字节 =》 00001000 10000000
................... .................
- 数据在计算机是以补码形式存储的,正数的补码是原码,负数的补码是除符号位外变反再加1
即n=n+128
- 存的是char数组,所以char要转换为0、1(数字)的时候要加48
C++版:
#include <iostream>
#include <bitset>
using namespace std;
int main() {
int n, num = 0;
for (int i = 1; i <= 10; i++) {
for (int j = 0; j < 32; j++) {
scanf("%d", &n);
if (n < 0) n = n + 128;
bitset<8> b(n);
cout << b;
num++;
if (num % 2 == 0) cout << endl;
}
}
return 0;
}
总结:bitset模板类
bitset模板类包含在C++的bitset头文件中,它是一种类似数组的结构,其每个元素只能是0或1,每个元素仅用1b的空间。bitset模板类可以实现整数类到二进制的自动转换:
#include <bitset>
bitset<8> t(24);//把24转换成一个8位的二进制数
T=30;//把30转换成一个8位的二进制数
bitset是C++ STL库中的一个类,用于表示二进制位集合。以下是bitset的用法:
头文件 #include <bitset>
创建一个bitset
bitset<8> bits; // 创建一个8位的bitset
bitset<8> bits(255); // 创建一个8位的bitset,初始值为255(二进制11111111)
bitset<16> bits("1010101010101010"); // 创建一个16位的bitset,初始值为二进制字符串"1010101010101010"
1.5年号字串(2019年试题B)
A对应1,B对应2,Z对应26,AA对应27,AB对应28...
思路;数组0到25对应数字1到26对应A到Z,算26进制
#include <stdio.h>
int main() {
char ch[26];//A~B(0~25)
char ans[5];//2019对应的字符串
int index = 0, n = 2019;
for (int i = 0; i < 26; i++) ch[i] = 'A' + i;//A~B(0~25) 'A'+0=A 'A'+1=B
while (n) {
int t = n % 26;//余数(26进制)
n = n / 26;//n除完后
if (t == 0) t += 26;
ans[index++] = ch[t - 1];//a[0]=...a[1]=...a[2]=... ...(倒着的)
}
for (int i = index - 1; i >= 0; i--)//(所以倒着输出)
printf("%c", ans[i]);
return 0;
}
(补)用printf函数输出数据
格式字符:
d格式符:用来输出一个有符号的十进制整数;
c格式符:用来输出一个字符;
s格式符:用来输出一个字符串;
f格式符:用来输出实数,以小数形式输出
①基本型,用%f
②指定数据宽度和小数位数,用%m.nf,如:%7.2f——代表数据占7位,小数2位。
③输出的数据向左对齐,用%-m.nf——与上相似,但当数据长度不超过m时,数据向左靠,右端补空格
e格式符:用格式声明%e指定以指数形式输出实数。
其他格式符:
①i格式符——与d格式符相同
②o格式符——以八进制数的形式输出
③x格式符——以十六进制数形式输出整数
④u格式符——用来输出无符号数据
⑤g格式符——用来输出浮点数系统自动选f格式或e格式输出
1.6纪念日(2020年试题B)
2020年7月1日是中国共产党成立99周年的纪念日。
中国共产党成立于1921年7月23日。
请问从1921年7月23日中午12时到2020年7月1日中午12时一共有多少分钟?
(补)四年一闰;百年不闰,四百年再闰;
(补)平年为365天,闰年为366天;
自己写的c语言代码:
#include <stdio.h>
int main() {
int a = (31 + 30 + 31 + 30 + 31 + 31 - 23) * 24 * 60;//1921年到1922年的时
int sum=0;//2020-1922=98年
int year;
for (int i = 1922; i < 2020; i++) {
if (i %4== 0 && i%100 != 0 || i%400 == 0) {
year = 366;
}
else {
year = 365;
}
sum += year;
}
int b = sum * 24 * 60;
int c = (31 + 29 + 31 + 30 + 31 + 30 + 1) * 24 * 60;
int fenzhong = a + b + c;
printf("%d",fenzhong);
return 0;
}
自己写的C++版:
#include <iostream>
using namespace std;
int main() {
int a = (31 + 30 + 31 + 30 + 31 + 31 - 23) * 24 * 60;//1921年到1922年的时
int sum = 0;//2020-1922=98年
int year;
for (int i = 1922; i < 2020; i++) {
if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) {
year = 366;
}
else {
year = 365;
}
sum += year;
}
int b = sum * 24 * 60;
int c = (31 + 29 + 31 + 30 + 31 + 30 + 1) * 24 * 60;
cout << a + b + c << endl;
return 0;
}
C++版:
#include <iostream>
using namespace std;
bool leapyear(int y) {
if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0)
return 1;
return 0;
}
int main() {
int i,sum;
sum = 12 * 60;
sum += 161 * 24 * 60;
for (i = 1922; i <= 2019; i++)
if (leapyear(i))
sum += 366 * 24 * 60;
else
sum += 365 * 24 * 60;
sum += 182 * 24 * 60;
sum += 12 * 60;
cout << sum << endl;
return 0;
}
1.7空间(2021年试题A)
小蓝准备用256MB的内存空间打开一个数组,数组中的每个元素都是32位二进制整数,如果不考虑程序占用的空间和维护内存需要的辅助空间,请问256MB的内存空间可以存储多少个32位二进制整数?
错的代码:算出来为负数(中途超int范围了)
#include <stdio.h>
int main() {
int s = (256 * 1024 * 1024 * 8 )/ 32;
printf("%d", s);
return 0;
}
对的c语言代码:
#include<stdio.h>
int main()
{
int result = 256 * 8/32*1024 * 1024;
printf("%d\n", result);
return 0;
}
对的C++代码:
#include <iostream>
using namespace std;
int main() {
cout << 256 * 8/32*1024 * 1024 << endl;
return 0;
}
总结:1B等于8b,1KB等于1024B,1MB等于1024KB,1GB等于1024MB,1TB等于1024GB,1PB等于1024TB
1.8时间显示(2021年试题F)
小蓝要和朋友合作开发一个显示时间的网站。在服务器上,朋友已经获取了当前时间,用一个整数表示,值为从1970年1月1日00:00:00到当前时刻经过的毫秒数。
现在,小蓝要在客户端显示这个时间。小蓝不用显示年、月、日,只需要显示时、分、秒即可,毫秒也不同显示,直接舍去即可。
给定一个用整数表示的时间,请将这个时间对应的时、分、秒输出。
例:输入46800999 输出13:00:00
#include <stdio.h>
#define ll unsigned long long
int main() {
ll num;
scanf("%lld", &num);
int day = 24 * 60 * 60 * 1000;
num = num % day;//去除天数数据
num /= 1000;//去除毫秒数据
int sec = num % 60;//求秒数
num /= 60;//去除秒数据
int min = num % 60;//求分钟数
num /= 60;//去除分钟数据
int hour = num;//剩下的就是小时数
printf("%02d:%02d:%02d", hour, min, sec);
return 0;
}
/注:unsigned是无符号的意思;
/在c语言中
1. %d代表直接输出整数a,例如:
int main()
{
int a = 1;
printf("%d\n",a);//输出结果为1
return 0;
}
2. %2d代表如果我们输出的数字位数为2,例如
int main()
{
int a = 1;
printf("%2d",a);//输出结果为:_1 _代表空格
return 0;
}
3. %02d也表示我们输出的数字位数为2,不一样的是,当我们输出的数字位数不够时,左边补0,例如:
int main()
{
int a = 1;
printf("%02d",a);//输出结果为:01
return 0;
}
4. %m.n表示我们输出的数字一共占m个位数,小数点后占n个。
总结:无论哪种表示方法如果我们定义的整数的位数大于我们想输出的数字的位数,输出时仍然 是我们定义的数字。例如
int main()
{
int a = 123;
printf("%01d", a);//输出结果为123
return 0;
}
1.9练习一:月份天数,输入年份和月份,输出该年该月共有多少天(需要考虑闰年)
自己写的代码(c语言版):
#include <stdio.h>
int main() {
printf("请输入年份和月份:\n");
int year, month, two, day;
scanf("%d %d", &year, &month);
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) { two = 1; }
else { two = 0; }
if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) { day = 31; }
else if (month == 4 || month == 6 || month == 9 || month == 11) { day = 30; }
else {
if (two == 1) { day = 29; }
else { day = 28; }
}
printf("%d",day);
return 0;
}
1.9练习题 练习2:ISBN码
蓝书P15面 ...形如x-xxx-xxxxx-x,最后一个x是校验码,前面的各个x分别乘以1、2、3...然后mod 11(mod的意思是求余),如果一样就输出Right,不一样就输出正确的ISBN码
自己写的代码(C语言版):
#include <stdio.h>
int main() {
printf("请输入ISBN:\n");
int a[10];
scanf("%1d-%1d%1d%1d-%1d%1d%1d%1d%1d-%d",
&a[0], &a[1], &a[2], &a[3], &a[4], &a[5], &a[6], &a[7], &a[8], &a[9]);
int chus = a[0] * 1 + a[1] * 2 + a[2] * 3 + a[3] * 4
+ a[4] * 5 + a[5] * 6 + a[6] * 7 + a[7] * 8 + a[8] * 9;
int yus;
yus = chus % 11;
if (yus == a[9]) {
printf("Right\n");
}
else {
a[9] = yus;
printf("%1d-%1d%1d%1d-%1d%1d%1d%1d%1d-%d\n",
a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9]);
}
return 0;
}
1.9练习题 练习3 分解质因数
求出区间[a,b]中所有整数的质因数分解,统计一共有多少种不同的分法,例输入6 10,输出10
网络上的代码(C++版):
#include<iostream>
using namespace std;
int main()
{
int a, b, i, k, m, count(0);
cin >> a >> b;
//不用先判断是否为质数
for (k = a; k <= b; k++) {
m = k;//不可直接用k分解,因分解完后永远(k=1,k++=2)
while (m > 1) {
i = 2;//最小可能的质因数
while (m % i != 0)i++;//直接i++,不用专门挑出质数去分解,若i++=合数,早已被其最小质因数分解,故无需挑出质数
count++;//质因数个数加一
m /= i;
}
}
cout << count;
return 0;
}
自己模仿写的C语言版:
#include <stdio.h>
int main() {
printf("请输入两个整数a和b:\n");
int a, b,j,two;
int count = 0;
scanf("%d %d", &a, &b);
for (int i = a; i <= b; i++) {
j = i;
while (j>1)
{
two = 2;
while (j % two != 0) two++;
count++;
j /= two;
}
}
printf("%d", count);
return 0;
}
1.9练习题 练习4:十进制转十六进制
给出一个非负整数,将它表示成十六进制的形式。
自己的代码(C语言版):
#include <stdio.h>
int main() {
printf("请输入需要转换的数:\n");
int a,temp;
int i = 0;
char arr[20];
scanf("%d", &a);
while (a) {
temp = a % 16;//十六进制倒过来的
if (temp == 10) { arr[i] = 'A'; }
else if (temp == 11) { arr[i] = 'B'; }
else if (temp == 12) { arr[i] = 'C'; }
else if (temp == 13) { arr[i] = 'D'; }
else if (temp == 14) { arr[i] = 'E'; }
else if (temp == 15) { arr[i] = 'F'; }
else { arr[i] = temp+'0'; }
a = a / 16;
i++;
}
for (int j = i-1; j >= 0; j--) {
printf("%c", arr[j]);
}
return 0;
}
1.9练习题 练习5:回文数
给定一个N(2<=N<=10或N=16)进制数M(其中,十六进制数为0~9与A~F),求最少经过几步可以得到回文数。如果在30步以内(包含30步)不能得到回文数,则输出-1。
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
int n, step;
string m;
int num[1005];
//判断是否为回文数
bool judge(int x) {
for (int i = 1; i <= x / 2; ++i) {
if (num[i] != num[x - i + 1])
return false;
}
return true;
}
//n进制数相加
int add(int x) {
int ans[1005] = { 0 };
for (int i = 1; i <= x; ++i) {
ans[i] = num[i] + num[x - i + 1] + ans[i];
ans[i + 1] += ans[i] / n;
ans[i] %= n;
}
if (ans[x + 1]) {
x++;
}
for (int i = x; i >= 1; --i) {
num[i] = ans[i];
}
return x;
}
int main() {
cin >> n >> m;
int len = m.size();
//转换为十进制
for (int i = 1; i <= len; ++i) {
if (m[i-1] < 65) {
num[i] = m[i - 1] - '0';
}
else {
num[i] = m[i - 1] - 'A' + 10;
}
}
while (step <= 30) {
if (judge(len)) {
cout << step << endl;
return 0;
}
step++;
len = add(len);
}
cout << "-1" << endl;
return 0;
}
自己写的错误代码:
#include <stdio.h>
int main() {
printf("请输入一个进制N和一个进制数数M:\n");
int N, temp,x=0;
char M[20];
int i = 0,j=0;
char ch[20];
scanf("%d %c", &N,&M[20]);
while (M[i]) {//十进制
temp = temp+M[i]-'0';
temp = (M[i]-'0') * N;
i++;
}
int yu,Mf, Mc=0;
for (int j = 0; j <= 30; j++) {
Mf = temp;
while (Mf) {
yu = Mf % 10;
Mf = Mf / 10;
Mc = Mc * 10 + yu;
}
temp = temp + Mc;//要测的回文数
while (temp) {
ch[j] = temp % 10;
temp = temp / 10;
j++;
}
for (int k = 0; k < (j - 1) / 2; k++) {
if (ch[k] != ch[j - 1-k]) {
printf("-1");
}
}
}
printf("%d", j);
}
1.9练习六 统计单词出现个数和第一个出现的位置
自己写的错误代码:
#include <stdio.h>
#include <string.h>
int main() {
printf("请输入要查找的单词和文本:\n");
char a[10]; char b[100]; int count = 0;
gets(a);
gets(b);
for (int i = 0; i < strlen(b); i++) {
if (a[0] == b[i]) {
for (int j = 0; i < strlen(a); j++) {
a[j] = a[i];
}count++;
}
}
printf("%d", count);
}
别人写的错误代码:
#include<stdio.h>
#include<string.h>
int main()
{
char a[1000], b[1000];
int count1[100];
int k = 0;
gets(a);
gets(b);
int len1 = strlen(a);
int len2 = strlen(b);
for (int i = 0; i < len1; i++)
{
if (a[0] == b[i])
{
int flag = 1;
for (int j = 0; j < len1; j++)
{
if (a[j] != b[i + j])
{
flag = 0;
break;
}
}
if (flag)
{
count1[k] = i;
k++;
continue;
}
}
}
if (k > 0)
{
printf("%d ", k);
printf("%d\n", count1[0]);
}
else
printf("-1\n");
return 0;
}
2.1 不高兴的津津
自己写的错误的代码:
#include <stdio.h>
int main() {
printf("请输入数据\n");
int one, time1, two, time2, three, time3, four, time4, five, time5, six, time6, seven, time7;
scanf("%d %d\n%d %d\n%d %d\n%d %d\n%d %d\n%d %d\n%d %d", &one, &time1,&two,&time2, &three,&time3, &four,&time4, &five,&time5, &six,&time6, &seven,&time7);
int arr[7]; int count = 0; int max;
arr[0] = one + time1;
arr[1] = two + time2;
arr[2] = three + time3;
arr[3] = four + time4;
arr[4] = five + time5;
arr[5] = six + time6;
arr[6] = seven + time7;
for (int i = 0; i < 7; i++) {
if (arr[i] > 8) {
count++;
}
}
if (count >= 2) {
for (int j = 0; j < 6; j++) {
if (arr[j++] > arr[j]) {
max = arr[j++];
}
else {
max = arr[j];
printf("%d", max);
}
}
}
else {
for (int k = 0; k < 7; k++) {
if (arr[k] >= 8)
printf("%d", arr[k]);
}
}
}