算法学习和整理

来源:互联网 发布:兰州知豆电动车租赁点 编辑:程序博客网 时间:2024/06/11 08:38

神奇的发现在c语言里面

#include<stdio.h>#include<math.h>int main(){    printf("%d",sqrt(-10));    return 0;}

输出的结果是0
而把%d换成%.0f输出的结果是
%.0f的输出结果
换成%.1f 结果则是-1.$
%.2f -1.#J
%3f -1.#IO
%4f -1.#IND
%5f -1.#IND0
%6f -1.#IND00
以此类推 并没有在网上找到合适的解释,周一去问一下钱徽男神:)



freopen("input.text","r",stdin);
freopen("output.text","w",stdout);

写在开头可以让scanf从文件input.txt读入,printf从output.txt写入【可能会更加的方便】
学会了修改codeblocks的背景颜色和光标的大小嘿嘿嘿


将键盘输入的大写字母按照键盘上的顺序往左边推一个(但是最左边的变成上一行的右边)

#include<stdio.h>int main(){    char s[] ="`1234567890-=QWERTYUIOP[]\ASDFGHJKL;'ZXCVBNM,./";        int i,c;        while((c = getchar()) != EOF){            for(i = 1; s[i] && s[i]!=c; i++);            if(s[i]) putchar(s[i-1]);            else putchar(c);        }    return 0;}

很有意思的是for(i = 1; s[i] && s[i]!=c; i++); 需要好好的注意,用一个for来找到原来的字母的位置,如果找到了,就输出他前面的一个字母。之前我这个傻逼,每次用的都是for+if的组合,发现for第一个分好后面其实只要是一个可以判 断结束标志的语句就可以了,不一定是一定和i有关系


回文串和镜像串的判断

ctype.h头文件的用途
里面有很多函数
isalpha isdigit isprint 判断字符的属性
toupper tolower 转换大小写
www.cplusplus.com这个网站上面有详细的介绍)
在文件前面的const char* msg[] 的使用

#include<stdio.h>#include<string.h>#include<ctype.h>const char* rev = "A   3  HIL JM O   2TUVWXY51SE Z  8 ";const char* msg[] = {"not a palindrome", "a regular palindrome", "a mirrored string","a mirrored palindrome"};// const char* msg[]常量数组的使用,字符串数组其实是个二维的字符数组char r(char ch) {  if(isalpha(ch)) return rev[ch - 'A'];  return rev[ch - '0' + 25];}int main() {  char s[30];  while(scanf("%s", s) == 1) {    int len = strlen(s);    int p = 1, m = 1;    for(int i = 0; i < (len+1)/2; i++) {     if(s[i] != s[len-1-i]) p = 0; //不是回文串     if(r(s[i]) != s[len-1-i]) m = 0; //不是镜像串    }    printf("%s -- is %s.\n\n", s, msg[m*2+p]);    }//这里写的特别的好,感觉数学真的蛮重要的    return 0;}

生成元
如果x加上x的各个数字之和得到y,就说x是y的生成元。给出n(1≤n≤100000),求最小
生成元。无解输出0。例如,n=216,121,2005时的解分别为198,0,1979。
先将每个数的生成元算出来,保存在一个数组里面,然后要求解的时候就去查表就可以了

#include<stdio.h>#include<string.h>#define maxn 100005int ans[maxn];int main(){    int T,n,m=1;    memset(ans,0,sizeof(ans));    for( m = 1;m < maxn ;m++){        int x = m,y = m;        while(x > 0){y += x%10;x /= 10;}        if(ans[y]==0|| m < ans[y] ) ans[y] = m;    }    scanf("%d",&T);    while(T--){        scanf("%d",&n);        printf("%d\n",ans[n]);    }    return 0;}

补码里面没有+0和-0
因为原来是-0的数现在是绝对值最大的负数了(8位的话是-127)

若要计算n位数补码二进制对应的十进制,需要知道每位数对应的数字,除了最高比特外,其他比特的对应数字均和一般二进制相同,即第i位数表示数字2i−1。但最高比特若为1时,其表示数字为 -2n−1,因此若用此方式计算0000 0101表示的数字,其结果为:
1111 1011 (−5) = −128 + 64 + 32 + 16 + 8 + 0 + 2 + 1 = (−27 + 26 + …) = −5

移位运算 x2 等价于 <<1 左移一位
2^8-1 可以写成 (1<<8)-1 注意运算符的优先级


纵横字谜的答案
题目链接

0 0