您的位置:首页 > 其它

一些供以后刷到重题调用的小结--2

2020-02-03 04:24 225 查看

#学校OJ已经刷到2000+啦,再来总结一下叭,感觉上这500分比以前要慢了…
偷机取巧了很多,遇到某些函数、重题真就直接来博客复制了,不愧是我,emmmmm,这样是不可以的!!!

0 .C语言算法之将十进制数转换成二进制数

【原文链接,感觉博主是大佬】https://blog.csdn.net/weixin_41676881/article/details/80745177````
导语:在C语言中没有将其他进制的数直接输出为二进制数的工具或方法,输出为八进制数可以用%o,输出为十六进制可以用%x,输出为二进制就要我们自行解决了。
具体算法体现在函数体内,使用了一个while(1)的死循环,当结果产生后跳出循环。变量yushu是每一次循环内产生的余数,变量x每次循环都会被赋予新的值,这个新的值就是每一次循环内产生的商。当产生的商小于2时即产生了最后的结果(二进制数),然后跳出循环。
例如:函数自变量若为7,用自变量7除以2,得到第一次循环产生的余数为1,第一次循环产生的商为3;用第一次循环产生的商3除以2,得到第二次循环产生的余数为1,第二次循环产生的商为1。
变量y的存放也是有一定技巧的,由于每次产生的余数都小于2并且都是最后二进制数中需要按位展现出来的,因此每一次循环产生的余数都要合理地进行存放。第一次产生的余数放在个位,第二次产生的余数放在十位,第三次产生的余数放在百位…依次类推,直至某一次循环产生的商小于2,最后再把小于2的那个商放在最高位。变量p的作用就是控制位数,变量y的初始值定为0,变量p的初始值定为1,每次循环内变量p都自乘10,每次循环内都让变量y加上yushup,这样就实现了余数的按位存放。最后将小于2的那个商乘以p加到变量y中,得到最后的二进制数。
例如:还是以自变量7为例,第一次循环后y的值为1,第二次循环内if语句之前y的值为11,if语句内y的值变为111,111即为7的二进制数。
注意:变量p的自乘要放在变量y加上yushup之后!顺序不能颠倒!

//某大佬教哒
#include<stdio.h>
#include<stdlib.h>//调用itoa函数
int main()
{
int n;
scanf("%d",&n);
char s[40];
itoa(n,s,2);//itoa(int value,char *string,int radix)
//value是被转换的整数,string是转换后存储的字符数组,radix转换进制数
printf("2进制:%s\n",s);
printf("8进制:%o\n",n);
printf("10进制:%d\n",n);
printf("16进制:%x\n",n);
return 0;
}
//取余,相除,然后倒序输出数组
#include <stdio.h>
void main()
{
//进制转换函数的声明
int transfer(int x);
int x;
printf("请输入一个十进制数:");
scanf("%d",&x);
printf("转换成二进制数是:%d\n",transfer(x));
}
int transfer(int x)
{
int p=1,y=0,yushu;
while(1)
{
yushu=x%2;
x/=2;
y+=yushu*p;
p*=10;
if(x<2)
{
y+=x*p;
break;
}
}
return y;
}

1.判断输入的数据为整数(合法)

C 标准库函数 - isdigit()
【菜鸟教程真好用】

#include <stdio.h>
#include <ctype.h>
int main()
{
int year;
scanf("%d",&year);
if(isdigit(year)){
/*如果 c 是一个数字,则该函数返回非零值,否则返回 0。*/
printf("Input error!\n");
}
else{
if(year%4==0&&year%100!=0||year%100==0&&year%400==0) printf("Yes\n");
else printf("No\n");
}
return 0;
}

2.getchar语句的使用

getchar()函数【字符输入函数】的作用是从计算机终端(一般为键盘)获取一个无符号字符。getchar()函数只能接收一个字符,其函数值就是从输入设备获取到的字符。
【百度到某博主的总结,原文链接:https://blog.csdn.net/YKbsmn/article/details/86762783】
一、
getchar有一个int型的返回值.当程序调用getchar时.程序就等着用户按键.
用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中).回车符也是字符
当用户键入回车之后,getchar才开始从stdio流中每次读入一个字符
注意:1.getchar函数的返回值是用户输入的第一个字符的ASCII码,如出错返回-1,且将用户输入的字符回显到屏幕.
2.使用本函数前必须包含文件<stdio.h>。
二、
如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取.也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键.
三、缓冲区
首先,用getchar()函数进行字符的输入,并不是直接从键盘这个硬件中读取输入的字符,而是从“输入缓冲区”中得到的字符。
输入缓冲区是一个字符的队列,其中存储了所有你尚未读取的字符。
每次调用getchar函数,它就会从输入缓冲区中读出第一个字符,并把这个字符从输入缓冲区中清除。
然而,这个输入缓冲区的设计,是把所有从键盘上输入的东西都放进去的,包括你每次按的回车符‘\n’,
而getchar函数只读走了你在回车前输入的那个字符,而将回车符保留在了输入缓冲区中。
于是,第二次调用getchar时,函数就从输入缓冲区中读出了’\n’。
要解决这个问题,有两种可行的途径。
一是多加一个getchar(),过滤掉回车,但是这种方法有不足,就是如果你在调用第一个getchar时输入了多个字符,
那么,加入一个getchar并不能把所有未读取的字符过滤。如果你的本意是重新从“键盘”读取的话,最好是加一个
fflush(stdin);
清除输入缓冲区
/*在c++中的处理方法:
1、可以使用rewind()函数来清理输入缓冲区中的数据。该函数的格式为
void rewind( FILE stream );
其中,参数stream表示指向FILE结构的指针,即为指定的流。该函数的作用是将文件指针移动到文件的起始位置处。rewind()函数清理指定流中的错误指示符以及文件结束指示符。
2、getchar()使用不方便,决方法:
(1)使用下面的语句清除回车:
while(getchar()!=’\n’);
(2)用getche()或getch()代替getchar(),其作用是从键盘读入一个字符(不用按回车),注意要包含头文件<conio.h>
*/
eg.

#include <stdio.h>
main()
{
char t, c1, c2;
c1=getchar();
c2=getchar();
if (c1 > c2){
t = c1;
c1 = c2;
c2 = t;
}

printf("%c,%c", c1, c2);
}
/*输入一行字符,分别统计其中每个元音字母(a、e、i、o、u不分大小写)的个数。
输入格式要求:信息提示:"Input a line of characters:\n"
输出格式要求:"%4d"
*/
#include<stdio.h>
int main()
{
printf("Input a line of characters:\n");
char c;
int na,ne,ni,no,nu;
na=ne=ni=no=nu=0;
while(c=getchar()) {//输入字符串,但每次只接收一个字符
if(c==10) break; //如果c为换行符,即表示字符串输入结束,则退出循环
switch(c){
case 'a':
case 'A':
na++;
break;
case 'e':
case 'E':
ne++;
break;
case 'i':
case 'I':
ni++;
break;
case 'o':
case 'O':
no++;
break;
case 'u':
case 'U':
nu++;
break;
}
}
printf("%4d%4d%4d%4d%4d",na,ne,ni,no,nu);
return 0;
}

3.穷举法

【百度】穷举法是一种针对于密码的破译方法。这种方法很像数学上的“完全归纳法”并在密码破译方面得到了广泛的应用。简单来说就是将密码进行逐个推算直到找出真正的密码为止。比如一个四位并且全部由数字组成其密码共有10000种组合,也就是说最多我们会尝试9999次才能找到真正的密码。利用这种方法我们可以运用计算机来进行逐个推算,也就是说用我们破解任何一个密码也都只是一个时间问题。
当然如果破译一个有8位而且有可能拥有大小写字母、数字、以及符号的密码用普通的家用电脑可能会用掉几个月甚至更多的时间去计算,其组合方法可能有几千万亿种组合。这样长的时间显然是不能接受的。其解决办法就是运用字典,所谓“字典”就是给密码锁定某个范围,比如英文单词以及生日的数字组合等,所有的英文单词不过10万个左右这样可以大大缩小密码范围,很大程度上缩短了破译时间。
在一些领域,为了提高密码的破译效率而专门为其制造的超级计算机也不在少数,例如IBM为美国军方制造的“飓风”就是很有代表性的一个。
穷举法解题,就是按照某种方式列举问题答案的过程。针对问题的数据类型而言,常用的列举方法一有如下三种:
(1)顺序列举 是指答案范围内的各种情况很容易与自然数对应甚至就是自然数,可以按自然数的变化顺序去列举。
(2)排列列举 有时答案的数据形式是一组数的排列,列举出所有答案所在范围内的排列,为排列列举。
(3)组合列举 当答案的数据形式为一些元素的组合时,往往需要用组合列举。组合是无序的。

不定方程,适用于穷举法求解。
【实例】百鸡问题&黑红白小球

  • 点赞
  • 收藏
  • 分享
  • 文章举报
绀香零八 发布了32 篇原创文章 · 获赞 10 · 访问量 959 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: