需求:实现将数组中所有元素调整为左右两部分,左边为奇数,右边为偶数。(c语言)
int main(){int size;printf("enter the size of arr:");scanf("%d",&size);int arr[size];for(int i;i<size;i++){ scanf("%d",&arr[i]);}printf("that is old one:\n");for(int j=0;j<size;j++){ printf("%d",arr[j]);}printf("\n");printf("that is the new:\n");for(int i=0;i<size;i++){ if(arr[i]%2!=0){ printf("%d",arr[i]); }for(int j=0;j<size;j++){ if(arr[j]%2==0){ printf("%d",arr[j]); }}printf("\n");printf("03dengsimin");return 0;}
中这段代码:
for(int i=0;i<size;i++){ if(arr[i]%2!=0){ printf("%d",arr[i]); }for(int j=0;j<size;j++){ if(arr[j]%2==0){ printf("%d",arr[j]); }}
能不能换成一下这个?
for(int i=0;i<size;i++){ if(arr[i]%2!=0){ printf("%d",arr[i]); }else{ printf("%d",arr[i]);}}
想问问为什么可换/为什么不能换?
谢谢指导,菜鸟万分感激。
不可换, 语义不同
第一种是打印所有奇数, 然后打印所有偶数
第二种是如果是奇数, 打印, 偶数也打印.
false
时,什么都不会做,但在后者中,会导致另一种输出出现。举几个测试例子:
// 两者表现一致[1, 3, 5, 2, 4, 6];// 两者表现不一致[1, 2, 3, 4, 5, 6];
可以看出来,除非数组本身已经达成了一种顺序(奇数在一端,偶数在一端),否则这种修改就会导致程序表现「不对劲」。
能不能换成一下这个?
不能。原因是,这样确实能够区分出奇数和偶数,但是无法达到左边为奇数,右边为偶数的效果。
就目前而言,你的代码中存在两个问题:
你没有为i
进行初始化。未初始化的i
中的值是不确定的,因此接下来代码的行为是不确定的
for (int i = 0; i < size; i++) { scanf("%d", &arr[i]); }
你的代码块错了。输出偶数的循环实际上包含在了输出奇数的循环中:
for(int i=0;i<size;i++){ if(arr[i]%2!=0){ printf("%d",arr[i]); } // <-------------这里应当是循环的结束 for(int j=0;j<size;j++){ if(arr[j]%2==0){ printf("%d",arr[j]); }} // <--------------将这个反花括号挪到上面注释的地方
这是修改后的代码:
#include <stdio.h>int main() { int size; printf("enter the size of arr:"); scanf("%d", &size); int arr[size]; for (int i = 0; i < size; i++) { scanf("%d", &arr[i]); } printf("that is old one:\n"); for (int j = 0; j < size; j++) { printf("%d", arr[j]); } printf("\n"); printf("that is the new:\n"); for (int i = 0; i < size; i++) { if (arr[i] % 2 != 0) { printf("%d ", arr[i]); } } printf("\n"); for (int j = 0; j < size; j++) { if (arr[j] % 2 == 0) { printf("%d ", arr[j]); } } printf("\n"); printf("03dengsimin"); return 0;}
如果你不仅需要将数组中的元素按照左边奇数右边偶数的格式输出,还需要将他们按照这样的格式排序的话,你的代码并不能满足你的要求。你需要撰写别的代码。
最简单的方法是直接将满足要求的数字放到一个新的数组中:
int new_arr[size];int new_arr_index = 0;for (int index = 0; index < size; ++index) { if (arr[index] % 2 == 1) { new_arr[new_arr_index++] = arr[index]; }}for (int index = 0; index < size; ++index) { if (arr[index] % 2 == 0) { new_arr[new_arr_index++] = arr[index]; }}printf("that is new one:\n");for (int index = 0; index < size; ++index) { printf("%d ", new_arr[index]); }
想问一下一个C语言的位运算小问题. 有没有一个简单的表达式的写法,可以得到一个32位无符号数,只保留其最左侧或者最右侧的1的结果? 比如35=(000..0100011),得到32或者1? 用循环写的话不难,但,用一个简洁的表达式能写出来吗?
问题内容: 我是ORMLite的主要作者,它使用类上的Java注释来构建数据库模式。我们的程序包最大的启动性能问题是在Android 1.6下调用注释方法。直到3.0我都看到了相同的行为。 我们看到以下简单的注释代码 难以置信地 占用大量GC,这是一个实际的性能问题。在快速的Android设备上,对注释方法的1000次调用几乎耗时一秒。Macbook Pro上运行的相同代码可以同时进行2800万次
第一次运行flutter程序,这是什么问题? 修改FLUTTER_STORAGE_BASE_URL还是提示这
问题内容: 我正在尝试在do while循环中发送多个帖子,但未添加结果 输出为:5、5、5、5、5, 我需要的输出是:1、2、3、4、5 问题答案: 由于AJAX的异步特性,当您的成功函数针对任何产生的AJAX请求运行时,循环已完成并将其设置为5。您需要捕获每个请求开始时的状态并使用捕获的状态方法中的状态。关闭值是最简单的方法: 但是,请理解,一个或多个请求可能会挂在服务器上,从而使后一个请求先
我已经实现了极大极小算法(带有阿尔法-贝塔剪枝),但是它的行为方式很有趣。我的球员将创造一个巨大的领先优势,但当它是时候做出最后的,获胜的举动,它不采取这一举措,只是继续拖延游戏。 这是我的极小极大函数: } 起初,我认为问题出在我的评估功能上,但如果是,我找不到它。在这个游戏中,两个玩家都有一个分数,我的函数只是从分数差中计算启发式值。在这里: 我已经把我的代码“翻译”成了英语,所以可能会有错别