1.double类型的数据不能用%f 作为scanf函数中的格式控制符!!!(否则输出会是0)
但是在printf中用%f和%lf都是没有错误的。
2.long long int类型在scanf和printf中都要是%lld!!!
我觉得这些没有什么规律吧,记住就好了。
(今天用codeblock发现printf中如果是%lld会有warning,换成%ll就好了)
3.define 在宏定义的时候,假如先#define max 10
然后**#define length max+1**,那么在编写过程中length不是直接替换成11的!而是写成max+1的形式,因此很有可能在运算的优先级上会出错!
4.关于数据类型的选择
假设我们想反转一个整数并且得到它的数值从而可以进行进一步的计算,那么在得到每一位的数组后,还需要把它们加起来。
如果你写成了这样:
int get_rever(int number) {
int digits[100]={0};
int length=0,remain=0,quotient=1;
int result=0;
int i;
while(quotient){
remain=number%10;
quotient=number/10;
digits[length++]=remain;
number=quotient;
}
for(i=0;i<length;i++){
result+=digits[i]*pow(10,length-i-1);
}
printf("%d\n",result);
return result;
}
输入12345,输出的结果只有54320。
(尝试输了一下 printf( " %d\n ", pow(10,0) ),发现输出是0 )
输入598465,输出了正确结果564895.
我觉得问题应该出在隐式的类型转换上,pow函数的返回值是double类型,因此会先以double类型为基础计算,最后再转为int类型(舍去小数部分)。
我觉得解决办法可以把result声明为double类型在控制输出的时候选择不输出小数点后的位数,这样写程序就通过了。
5.while中scanf做控制条件
假如想以输入-1为终止条件,用
while(scanf("%d",&input)!=-1)
作为判断条件是无法终止循环的!!
当输入-1的时候,scanf的函数返回值仍然是1!(可以用printf自己试一下)
5.用strlen的时候一定是在输入了字符串之后!!
只声明了字符串还没有输入的时候就对变量length初始化得到的值是0,所以后续的循环都不会执行。
6.关于结构体的输出问题
主函数是这样的:
int main() {
frac Frac;
get_frac(&Frac);
print_frac(&Frac);
return 0;
}
而且两个函数的函数原型分别为:
void get_frac(frac*Frac);
int is_consistent(int deno,int numer,double value);
void print_frac(const frac*Frac);
很奇怪的是如果在get_frac函数中输出,结果就是对的;
但如果单独把输出部分作为函数,输出的像是没有经过初始化的数组的随机值。(但是get_frac中的指针没有加const啊??)
7.给定n个长方形,判断是否有三个长方形可以构成一个更大的长方形。
原题如下:
Give you N rectangles.If you can pick exactly three pieces of those rectangles to form a larger rectangle?
input:
There are several testcases.
The first line is an integer T, indicating the number of testcases.
For each testcase:
The first line is a integer N and N is no more than 10.
The second line contains 2*N integers describing N rectangles.Each rectangle is described by 2 integers indicating as width and height.
All these integers in the second line are between [1,10000]
output
If you can do it, print Yes.Otherwise, print No instead.
一开始,我简单理解成了三个小长方形的面积之和要是给定的长方形之一的面积,就用数组记录每个的面积,排序之后具体算三个的和是不是也在这个数组中。
后来,我光考虑了一种比较复杂的情况:
有两个长方形的宽或者高相同,并且剩下的两边之和也要在数组中(具体在宽的数组中还是高的数组中无所谓)。
漏下了还有一种可能是三个长方形的高或者宽均相同。
但是在判断的时候,如果只是去数组中遍历,会有错误。因为简单的情况中是一定会出现temp2的,所以可以设一个counter变量,判断它是不是大于二。
如下:
int is_consistent(const int*width,const int*height,int recnum) {
int i,j;
int temp1=0,temp2=0;
for(i=0;i<recnum-1;i++) {
for(j=i+1;j<recnum;j++) {
if(width[i]==width[j]) {
temp1=height[i]+height[j];
temp2=width[i];
}
else if(width[i]==height[j]) {
temp1=height[i]+width[j];
temp2=width[i];
}
else if(height[i]==width[j]) {
temp1=width[i]+height[j];
temp2=height[i];
}
else if(height[i]==height[j]) {
temp1=width[i]+width[j];
temp2=height[i];
}
if(is_exist(temp1,temp2,width,height,recnum)) {
return 1;
}
}
}
return 0;
}
int is_exist(int temp1,int temp2,const int* width,const int* height,int recnum) {
int i;
int counter=0;
for(i=0;i<recnum;i++) {
if(width[i]==temp1||height[i]==temp1) {
return 1;
}
if(width[i]==temp2||height[i]==temp2) {
counter++;
}
}
if(counter>2) {
return 1;
}
return 0;
}
8.float类型转为int类型时的问题
比如这道题:
有关专家十分关注珠江渔业资源的问题。目前珠江中大约有X条鱼,平均每年以y%的速度减少。请编写一个程序,计算在多少年之后鱼的数目下降到目前的一半?多少年后下降到目前的十分之一?
很简单的一道数学题,通过对数的换底公式就能解决,但是在float 转为int类型的时候都是舍弃小数点之后的位数的,而题目是要求将位数进上去的。所以可以这样判断
if(year>(int)year) {
year++;
}
(不能直接不判断就year自增一,会有year=(int)year 的情况!)
9.判断是否是字串的问题
这道题要求是str2中的字符连续出现在str1中,而不是仅仅保证字母间的顺序相同(曾经有一道这种题,可以通过依次返回str2中每个字符最早出现的位置,并且以该位置作为寻找下一个字符的起始位置)。
所以一开始我的判断部分是这样的:
int is_substring(const char*str1,const char*str2) {
int len1=strlen(str1),len2=strlen(str2);
int counter=0,flag=1;
int i=0,j=0;
for(i=0;i<len1&&flag;i++) {
if(str1[i]==str2[j]) {
counter++;
j++;
}
else {
counter=0;
j=0;
}
if(counter==len2) {
flag=0;
}
}
if(!flag) {
return 1;
}
return 0;
}
但是后来发现会对某些情况不能得到正确结果,比如:
str1是aabc,而str2是abc。
这个时候当判断到str1中的第二个元素时因为counter置为0导致每一个元素都错了一位,最后输出结果是0.(但是上机居然过了,好神奇)
修改成这样就对了:
else {
counter=0;
j=0;
if(str1[i]==str2[j]) {
counter++;
j++;
}
}
10.方幂与进制转换
Description
给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是: 1,3,4,9,10,12,13,… (该序列实际上就是:30,31,30+31,32,30+32,31+32,30+31+32,…) 请你求出这个序列的第N项的值(用10进制数表示)。 例如,对于k=3,N=100,正确答案应该是981。
Input
输入两个数据,分别为k及N (k、N的含义与上述的问题描述一致,且3≤k≤15,10≤N≤1000)。
Output
输出第N项的值(用10进制数表示),以换行结束。
思路:对于平常的排序之后再输出的思路,我觉得这道题不是很合适,因为每一项中不同方幂的和的组合情况会越来越多,不好想。
使用进制转换会更容易发现它们的规律!!!
将N用二进制表示,再将相应的二进制用转为K进制下的十进制表示的数。
11.快速的得到一个数的长度
没有比要一步步得到每一位的数,然后counter++!
可以通过取以10为底的log值!!!!
k=(int)log10(number)+1
12.几种得到整数的方法
ceil(x) 返回不小于x的最小整数值
floor(x)返回不大于x的最大整数值
round(x)返回x的四舍五入值
也就是说,ceil(5.3)会得到6,floor(5.3)会得到5。
13.rounded to the nearest penny
今天在网上做题的时候发现题目中有一句“rounded to the nearest penny”,一开始不知道是什么意思,但是看它给的输出是小数点后两位,所以也按两位进行的输出。
后来才发现,原来“rounded to the nearest penny”或者“round to the nearest cent”就是“ round to the nearest hundredth”!!因为格式控制符就是按照四舍五入来进行的输出,所以这样直接%.2f就可以了。