C语言部分里有: 转义字符 宏定义 const 等相关的四道题
代码部分: 尼科彻斯定理 等差数列 数组在升序数组中出现的次数 计算日期到天数的转换
C语言
\ 是转义字符
\ddd ddd表示1到3个八进制数 如:\130 转义为 字符X (因为八进制不会出现8,所以'\8'一定是错误的)
\xhh hh表示1到2位十六进制数 如:\x30 转义为 字符0
以下程序段的输出结果是( )
#include<stdio.h> int main() { char s[] = "\\123456\123456\t"; printf("%d\n", strlen(s)); return 0; }
A: 12 B: 13 C: 16 D: 以上都不对
答案:A
\\表示'\'
\123 表示将123转为八进制后对应的字符
\t表示一个制表符
test.c 文件中包括如下语句,文件中定义的四个变量中,是指针类型的变量为【多选】( )
#define INT_PTR int* typedef int* int_ptr; INT_PTR a, b; int_ptr c, d;
A: a B: b C: c D: d
答案:ACD
因为#define是宏定义,仅仅是直接替换,INT_PTR a, b; 进行宏替换后代码是这样的:int *a, b;这里的int *是a的类型,b的类型是int,故此次b只是int类型。而typedef是把该类型定义一个别名,别名是一个独立的类型了,使用这个类型创建的变量都是这个类型的。
(宏替换后的int * a, b a是指针,b是int 直接定义的int * a,b 两个都是指针)
若给定条件表达式 (M)?(a++):(a--) ,则其中表达式 M ( )
A: 和(M==0)等价 B: 和(M==1)等价 C: 和(M!=0)等价 D: 和(M!=1)等价
答案:C
这个...下次应该不会错了吧(#^.^#)
下面3段程序代码的效果一样吗( )
int b; (1)const int *a = &b; (2)int const *a = &b; (3)int *const a = &b;
A: (2)=(3) B: (1)=(2) C: 都不一样 D: 都一样
答案:A
const在*的左边,则指针指向的变量的值不可直接通过指针改变(可以通过其他途径改变);在*的右边,则指针的指向不可变。简记为"左定值,右定向"。
对于下面的说法,正确的是( )
A: 对于 struct X{short s;int i;char c;},sizeof(X)等于sizeof(s) + sizeof(i) + sizeof(c)
B: 对于某个double变量 a,可以使用 a == 0.0 来判断其是否为零
C: 初始化方式 char a[14] = "Hello, world!"; 和char a[14]; a = "Hello, world!";的效果相同
D: 以上说法都不对
答案:D
A内存对齐;B考察double类型的比较,由于浮点数存在误差,不能直接判断两个数是否相等,通常采用比较两数之差的绝对值是否小于一个很小的数字(具体的可自己设定这样一个数,作为误差)来确定是否相等;C第二个的初始化方式是不正确的,a为数组首地址是常量不能改变。
代码
我的代码
#include <iostream>
using namespace std;
int main() {
int m;
while (cin >> m) {
if(m % 2 == 0)
{
int i = (m*m + 1) - 2*(m/2);
for(int j = 1; j < m; j++)
{
printf("%d+",i);
i+=2;
}
printf("%d",i);
}
else{
int i = m*m - 2*(m/2);
for(int j = 1; j < m; j++)
{
printf("%d+",i);
i+=2;
}
printf("%d",i);
}
}
}
另一版答案(sprintf还需要研究一下)
#include <stdio.h>
int main()
{
int m;
while(~scanf("%d", &m)){
int start = m * (m - 1) + 1;//找到对应m^3的起始奇数
char buf[10240] = {0};
//sprintf(buf, format, ...) 与printf用法类似,格式化字符串但是不用于打印而是放到一个buf中
sprintf(buf, "%d", start);//先将起始奇数转换成为字符串存入buf中
for (int i = 1; i < m; i++) {
//然后将紧随随后的m-1个奇数数字转换为字符串,按照指定格式放入buf中
//%s+%d, 要求先有一个字符串,然后是+符号,然后是个数字的格式,对应是buf原先的数据,和奇数
sprintf(buf, "%s+%d", buf, start+=2);
}
printf("%s\n", buf);
} r
eturn 0;
}
就是求和,简单的
#include <iostream>
using namespace std;
int main() {
int n;
while (cin >> n) {
int last_num = 2 + 3*(n - 1);
int ret = 0;
ret = (2 + last_num)*n/2;
cout << ret << endl;
}
}
用到了二分
int GetNumberOfK(int* nums, int numsLen, int k ) {
if (numsLen == 0) return 0;
int left = 0;
int right = numsLen - 1;
int count = 0;
int mid = (left + right)/2;
while(left <= right)
{
if(nums[mid] > k)
right = mid - 1;
else if(nums[mid == k])
break;
else
left = mid + 1;
mid = (left + right)/2;
}
if(nums[mid] == k)
{
count++;
int left_ans = mid - 1;
int right_ans = mid + 1;
while(left_ans >=0 && nums[left_ans--] == k) ++count;
while(right_ans < numsLen && nums[right_ans++] == k) ++count;
}
return count;
}
计算某个日期是当年的第几天
#include <stdio.h>
int main() {
int year, month, day;
while (scanf("%d %d %d", &year, &month, &day) != EOF) {
//存储每个月的天数
int month_day[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
//判断闰年
if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0) month_day[2] = 29;
//加天数
int days = 0;
for(int i = 1; i < month; ++i) days += month_day[i];
days += day;
printf("%d",days);
}
return 0;
}
-The End-