供参考:
//(1)
#include <stdio.h>
#define N 100
int main()
{
int i = 0, k;
float a[N];
while (scanf("%f", &a[i++]) == 1 && (getchar()) != '\n');
for (k = i, i = 0; i < k; i++)
printf(i ? ",%g" : "%g", a[i]);
printf("\n%d", k);
return 0;
}
//(2)
#include <stdio.h>
#include <string.h>
#define N 50
struct student {
char id[10];
char name[16];
char sex[8];
int age;
}stu[N];
int main()
{
int i = 0, k;
while (1) {
scanf("%s", stu[i].id);
if (!strcmp(stu[i].id, "##")) break;
scanf("%s%s%d", stu[i].name, stu[i].sex, &stu[i].age);
i++;
}
printf("%d\n", i);
for (k = i, i = 0; i < k; i++)
printf("%s,%s,%s,%d\n", stu[i].id, stu[i].name, stu[i].sex, stu[i].age);
return 0;
}
//(3)
#include <stdio.h>
#define N 100
int main()
{
int i = 0, k, a[N];
while (scanf("%d", &a[i++]) == 1 && (getchar()) != '\n');
for (k = i, i = 0; i < k; i++)
printf(i ? ",%d" : "%d", a[i]);
return 0;
}
float f[100];
int n=0;
float a;
scanf("%f",&f[n++]);
while(getchar() != '\n')
scanf("%f",&f[n++]);
for(int i=0;i<n;i++)
{
if(i==0)
printf("%g",f[i]);
else
printf(",%g",f[i]);
printf("\n%d",n);
}
我们发现,代码跑出来的答案和我们自己想的有很大的差距:
我们观察第一个结果,,n以整型的形式放进去,然后再以整型%d的形式取出来,结果是9,这是合理的,,第二个结果是,n以整型的形式存进去,然后以%f,浮点型的形式取出来,,
int整型占4byte,float类型也占4byte,float*类型的指针变量pFloat,解引用就会访问4byte,跳过一个float类型,而拿出来的结果是不一样的,不是9.000000,这就说明,浮点型和整型在
内存中的存储方式是不一样的,如果一样的话,拿出来的结果应该是一样的,对于第三个结果,,以浮点型的形式存进去,再以%d整型的形式取出来,结果不是9,这又说明了,浮点型和
整型在内存中的存储方式是不一样的,对于第四个结果,以浮点型的形式存进去,然后以%f浮点型的形式取出来,结果是9.000000,这是合理的;
以整形的视角放进去,再以整型的视角拿出来,,结果是对的,,以浮点型的视角放进去,再以浮点型的视角拿出来,,结果也是对的,,但是混淆放拿结果就是乱的;
我能够提供一些有关问题2和问题3的指导。
问题2:给定一个数组,找出只出现一次的两个数字。
该问题可以使用位运算的异或操作来解决。因为每个数字都出现了两次,所以异或所有数字将得到那两个只出现一次的数字的异或值。
接下来,我们需要从异或值中提取两个数字。我们可以找到异或值中第一个为1的位,并将数组分成两部分:该位为1的数字和该位为0的数字。再次使用异或操作就可以在每个子数组中找到一个只出现一次的数字。
下面是伪代码:
function find_two_appear_once(arr): xor_val = 0 // 存放所有数字的异或值 for num in arr: xor_val = xor_val ^ num // 找到第一个不同位,并用它来分割数组 diff_bit = find_first_bit(xor_val) num1 = 0 // 第一个只出现一次的数字 num2 = 0 // 第二个只出现一次的数字 for num in arr: if get_bit(num, diff_bit) == 1: num1 = num1 ^ num else: num2 = num2 ^ num return (num1, num2)
代码示例可以参考题目中提供的段落2。
问题3:给定一个数组,找出只出现一次的两个数字。
该问题同样可以使用位运算中的异或操作解决。与问题2不同的是,数组中只有一个数字出现了一次,其他数字都出现了两次。因此,我们首先将所有数字进行异或操作,这会得出那个出现了一次的数字。
接下来,我们要想办法将那个数字找出来。我们可以找到异或值中第一个为1的位,因为那个出现了一次的数字在该位上一定是1。然后将数组分成两部分:该位为1的数字和该位为0的数字。对于每个子数组,我们可以使用问题2中的方法来找出单独的数字。
下面是伪代码:
function find_appear_once(arr): xor_val = 0 // 存放所有数字的异或值 for num in arr: xor_val = xor_val ^ num // 找到第一个不同位,并用它来分割数组 diff_bit = find_first_bit(xor_val) num = 0 // 那个只出现一次的数字 for num in arr: if get_bit(num, diff_bit) == 1: num1 = num1 ^ num else: num2 = num2 ^ num return num
代码示例可以参考题目中提供的段落3。
#include <stdio.h>
#define MAX_SIZE 100
int main() {
int array[MAX_SIZE];
int count = 0;
int num;
while (scanf("%d", &num) == 1) {
array[count] = num;
count++;
}
// 用逗号输出数组
for (int i = 0; i < count; i++) {
printf("%d", array[i]);
if (i != count - 1) {
printf(", ");
}
}
printf("\n");
printf(": %d", count);
return 0;
}