指针的作业

  1. 求Sn = a + aa + aaa + aaaa + aaaaa的前五项和,其中a是一个数字。

例如:2 + 22 + 222 + 2222 + 22222

/*
求Sn = a + aa + aaa + aaaa + aaaaa的前五项和,其中a是一个数字。 例如:2 + 22 + 222 + 2222 + 22222
*/
#include <stdio.h>
int main(){
//由a组成前n项之和 - 不考虑溢出
int a = 0;
int n = 0;
scanf("%d %d",&a,&n);
int i = 0;
int sum = 0;
int ret = 0;
for(i = 0;i < n;i++){
ret = ret * 10 + a;
sum = sum + ret;
}
printf("%d\n",sum);
return 0;
}
  1. 写一个函数打印arr数组的内容,不使用数组下标,使用指针。

arr是一个整型一维数组。

/*
写一个函数打印arr数组的内容,不使用数组下标,使用指针。
arr是一个整型一维数组。
*/
#include <stdio.h>
int main(){
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int * p = arr;
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for(i = 0;i < sz;i++){
printf("%d ",*(p+i));
}
return 0;
}
  1. 求出0~100000之间的所有“水仙花数”并输出。

    “水仙花数”是指一个n位数,其各位数字的n次方之和正好等于该数本身。

    例如:153 = 1^3 + 5^3 + 3^3 ,则153是一个“水仙花数”。
/*
求出0~100000之间的所有“水仙花数”并输出。
“水仙花数”是指一个n位数,其各位数字的n次方之和正好等于该数本身。
例如:153 = 1^3 + 5^3 + 3^3 ,则153是一个“水仙花数”。
*/
#include <stdio.h>
#include <math.h>
int main(){
int i = 0;
for(i = 0;i <= 100000;i++){
//判断i是否会自幂数
int n = 1;//计算位数
int tmp = i;
while(i / 10){
n++;
tmp = tmp / 10;
}
//计算i的每一位的n次方之和
tmp = i;
int sum = 0;
while(tmp){
//pow是用来求次方的
sum = sum + pow(tmp % 10,n) ;
tmp = tmp / 10;
}
//判断
if(sum == i){
printf("%d ",i);
}
}
return 0;
}
  1. ​ 写一个函数,逆序字符串内容
/*
写一个函数,逆序字符串内容
*/
#include <stdio.h>
#include <string.h>
#include <assert.h>
void reverse(char* str){
assert(str);
int len = strlen(str);
char* left = str;
char* right = str + len -1;
while(left < right){
char tmp = *left;
*left = * right;
*right = tmp;
left++;
right--;
}
}
int main(){
char arr[] = "abcdef";
reverse(arr);
printf("%s",arr);
return 0;
}
  1. 打印杨辉三角
/*
打印杨辉三角
*/
#include <stdio.h>
#include <string.h>
#include <assert.h> int main(){
int arr[10][10] = {0};
int i = 0;
int j = 0;
for(i = 0;i < 10;i++){
for(j = 0;j < 10;j++){
if(j == 0){
arr[i][j] = 1;
}
if(i == j){
arr[i][j] = 1;
}
if(i >= 2 && j >= 1){
arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
}
}
}
for(i = 0;i < 10;i++){
for(j = 0;j <=i;j++){
printf("%d",arr[i][j]);
}
printf("\n");
}
return 0;
}
  1. 猜凶手

日本某地发生了一件谋杀案,警察通过排查确定查人凶手为4个嫌疑犯的一个。

以下为4个嫌疑犯的供词:

A:不是我。

B:是C

C:是D

D:C在胡说

已知三个人说了真话,一个人说的是假话。

请根据这些信息,写一个程序来确定到底谁是凶手。

#include <stdio.h>
int main(){
int killer = 0;
for(killer = 'A';killer <= 'D';killer++){
if((killer != 'A') + (killer == 'C') + (killer == 'D') + (killer != 'D') == 3){
printf("%c\n",killer);
}
}
return 0;
}
  1. 猜名次

5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:

A:B第二,我第三

B:我第二,E第四

C:我第一,D第二

D:C最后,我第三

E:我第四,A第一

比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。

#include <stdio.h>
int main(){
int a = 0;
int b = 0;
int c = 0;
int d = 0;
int e = 0;
for(a = 1;a <= 5;a++){
for(b = 1;b <= 5;b++){
for(c = 1;c <= 5;c++){
for(d = 1;d <= 5;d++){
for(e = 1;e <= 5;e++){
if(((b == 2) + (a == 3) == 1)
&& ((b == 2) + (e == 4) == 1)
&& ((c == 1) + (d == 2) == 1)
&& ((c == 5) + (d == 3) == 1)
&& ((e == 4) + (a == 1) == 1)
){
if(a*b*c*d*e == 120){
printf("a=%d,b=%d,c=%d,d=%d,e=%d\n",a,b,c,d,e);
}
}
}
}
}
}
}
return 0;
}
int a[3][4] = {0};
printf("%d\n",sizeof(a));// 48 = 3*4*sizeof(int)
printf("%d\n",sizeof(a[0][0]));//4 - a[0][0]
printf("%d\n",sizeof(a[0]));//16
printf("%d\n",sizeof(a[0]+1));//4 解释:a[0]作为数组名并没有单独放在sizeof内部,也没有取地址,所以a[0]就是第一行第一个元素的地址。a[0]+1 就是第一行第二个元素的地址
printf("%d\n",sizeof(*(a[0]+1)));//4 *(a[0]+1)是第一行第二个元素
printf("%d\n",sizeof(a+1));
/*
a是二维数组的数组名,并没有取地址,也没有单独存放在sizeof内部,所以a表示二维数组首元素的地址,即:第一行的地址,a+1就是二维数组第二行的地址
*/
printf("%d\n",sizeof(*(a+1)));//16 a+1市第二行的地址,所以解引用后表示第二行的大小就是16
printf("%d\n",sizeof(&a[0]+1));//4 a[0]是第一行的数组名,&a[0]是第一行的地址,&a[0]+1就是第二行的地址
printf("%d\n",sizeof(*(&a[0]+1)));//16 &a[0]+1就是第二行的地址,解引用后就是第二行,所以计算第二行的大小
printf("%d\n",sizeof(*a));//16 第一行的大小 等价a[0]
/*
a作为二维数组的数组名,没有&,没有单独放到sizeof内部,a就是首元素的地址即第一行的地址,所以解引用就是第一行的大小
*/
printf("%d\n",sizeof(a[3]));//16 sizeof内部的表达式不计算 所以判断的是类型 所以其实不存在也能够通过类型计算
#include <stdio.h>
int main()
{
char *a[] = {"work","at","alibaba"};
char**pa = a;
pa++;
printf("%s\n", *pa);
return 0;
}

int main()
{
char *c[] = {"ENTER","NEW","POINT","FIRST"};
char**cp[] = {c+3,c+2,c+1,c};
char***cpp = cp;
printf("%s\n", **++cpp);
printf("%s\n", *--*++cpp+3);
printf("%s\n", *cpp[-2]+3);
printf("%s\n", cpp[-1][-1]+1);
return 0;
}

杨氏矩阵:有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找一个数字是否存在。要求:时间复杂度小于O(N)。

#include <stdio.h>
int findNum(int arr[3][3],int* px,int* py,int k ){
int x = 0;
int y = *py-1;
while(x < *px && y >= 0){
if(arr[x][y] < k){
x++;
} else if(arr[x][y] > k){
y--;
}else{
*px = x;
*py = y;
return 1;
}
}
return 0;
}
int main(){
int arr[3][3] = {1,2,3,4,5,6,7,8,9};
int k = 7;
int x = 3;
int y = 3;
int ret = findNum(arr,&x,&y,k);
if(ret == 1){
printf("找到了\n");
printf("坐标为:%d,%d\n",x,y);
}else if(ret != 1){
printf("没找到\n");
}
return 0;
}

字符串左旋

实现一个函数,可以左旋字符串中的k个字符。

例如:ABCD左旋一个字符可以得到BCDA

ABCD左旋两个字符可以得到CDAB

#include <stdio.h>
#include <string.h>
void LeftMove(char* str,int k){
int i = 0;
int n = strlen(str);
for(i = 0;i < k;i++){
//每次左旋转一个字符
char tmp = *str;
//后面的n-1个字符
int j = 0;
for(j = 0;j < n-1;j++){
*(str + j) = *(str + j +1);
}
//tmp放在最后
*(str + n - 1) = tmp;
}
}
int main(){
char arr[10] = "ABCDEF";
int k = 2;
LeftMove(arr,k);
printf("%s\n",arr);
return 0;
}

另一种方法,三步翻转法

#include <stdio.h>
#include <string.h>
#include <assert.h>
void reverse(char *left,char *right){
assert(left);
assert(right);
while(left < right){
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
void LeftMove(char* str,int k){
assert(str);
int n = strlen(str);
//左
reverse(str,str+k-1);
//右
reverse(str+k,str+n-1);
//整体
reverse(str,str+n-1);
}
int main(){
char arr[10] = "ABCDEF";
int k = 2;
LeftMove(arr,k);
printf("%s\n",arr);
return 0;
}

写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。

例如:给定s1=AABCD,s2=BCDAA返回1

给定s1=ABCD,s2=ACBD,返回0

#include <stdio.h>
#include <string.h>
#include <assert.h>
int IsStringRotate(char *str1,char *str2){
int i = 0;
int n = strlen(str1);
for(i = 0;i < n;i++){
//每次左旋转一个字符
char tmp = *str1;
//后面的n-1个字符
int j = 0;
for(j = 0;j < n-1;j++){
*(str1 + j) = *(str1 + j +1);
}
//tmp放在最后
*(str1 + n - 1) = tmp;
if(strcmp(str1,str2) == 0){
return 1;
}
}
return 0;
}
int main(){
/*
AABCD左旋一个字符:ABCDA
AABCD左旋两个字符:BCDAA
AABCD右旋一个字符:DAABC
*/
char arr1[] = "AABCD";
char arr2[] = "BCDAA";
int ret = IsStringRotate(arr1,arr2);
if(ret == 1){
printf("yes\n");
}else{
printf("no\n");
}
return 0;
}

另一种方法:

#include <stdio.h>
#include <string.h>
#include <assert.h>
int IsStringRotate(char *str1,char *str2){
//长度不相等肯定不是旋转得到的
if(strlen(str1) != (strlen(str2))){
return 0;
}
//1.str1字符串后面追加一个str1
//AABCDAABCD
int len = strlen(str1);
strncat(str1,str1,len);
//2.判断str2是否为str1的子串
char *ret = strstr(str1,str2);
if(ret == NULL){
return 0;
}else{
return 1;
}
}
int main(){
/*
AABCD左旋一个字符:ABCDA
AABCD左旋两个字符:BCDAA
AABCD右旋一个字符:DAABC
*/
char arr1[20] = "AABCD";
char arr2[] = "BCDAA";
int ret = IsStringRotate(arr1,arr2);
if(ret == 1){
printf("yes\n");
}else{
printf("no\n");
}
return 0;
}

欢迎关注公众号:愚生浅末。

C语言指针的作业的更多相关文章

  1. C语言博客作业6---结构体&文件

    C语言博客作业6---结构体&文件 1.本章学习总结(2分) 1.1思维导图 请以思维导图总结本周的学习内容.如下图所示: 1.2.学习体会 描述本周学习感受,也可以在这里提出你不理解地方.对 ...

  2. C语言博客作业5--指针

    C语言博客作业5--指针 1.本章学习总结(2分) 1.1思维导图 请以思维导图总结本周的学习内容,如下图所示: 1.2本章学习体会及代码量学习体会 1.2.1学习体会 描述本周学习感受,也可以在这里 ...

  3. C语言指针转换为intptr_t类型

    1.前言 今天在看代码时,发现将之一个指针赋值给一个intptr_t类型的变量.由于之前没有见过intptr_t这样数据类型,凭感觉认为intptr_t是int类型的指针.感觉很奇怪,为何要将一个指针 ...

  4. [转]C语言指针学习经验总结浅谈

    指针是C语言的难点和重点,但指针也是C语言的灵魂 . 这篇C语言指针学习经验总结主要是我入职以来学习C指针过程中的点滴记录.文档里面就不重复书上说得很清楚的概念性东西,只把一些说得不清楚或理解起来比较 ...

  5. 不可或缺 Windows Native (7) - C 语言: 指针

    [源码下载] 不可或缺 Windows Native (7) - C 语言: 指针 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 指针 示例cPointer.h #i ...

  6. C语言指针学习

    C语言学过好久了,对于其中的指针却没有非常明确的认识,趁着有机会来好好学习一下,总结一下学过的知识,知识来自C语言指针详解一文 一:指针的概念 指针是一个特殊的变量,里面存储的数值是内存里的一个地址. ...

  7. (转载)c语言指针学习

    前言 近期俄罗斯的陨石.四月的血月.五月北京的飞雪以及天朝各种血腥和混乱,给人一种不详的预感.佛祖说的末法时期,五浊恶世 ,十恶之世,人再无心法约束,道德沦丧,和现在正好吻合.尤其是在天朝,空气,水, ...

  8. 关于C语言指针的问题

    在学习关于C语言指针的时候,发现这样一个问题,代码如下: #include<stdio.h> #include<stdlib.h> #include<string.h&g ...

  9. C语言指针类型 强制转换

    关于C语言指针类型 强制转换  引用一篇文章: C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值.不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个 ...

  10. C语言指针和数组知识总结(上)

    C语言指针和数组知识总结(上) 一.指针的基础 1.C语言中,变量的值能够通过指针来改变,打印指针的语句符号可以是:  %08x 2.指针的本质 指针的本质就是变量,那么既然是变量,那么一定会分配地址 ...

随机推荐

  1. LVS介绍与配置

    目录 LVS(Linux Virtual Server) 1. 概述 1.1 LVS简介 1.2 LVS架构 2. LVS工作模式 2.1 NAT模式(Network Address Translat ...

  2. DASCTF X GFCTF 2024|四月开启第一局 [PWN]详解

    DASCTF X GFCTF 2024|四月开启第一局[PWN] wp(详解) 1.dynamic_but_static 题目保护情况 64位程序,没有开canary和pie保护,got表可改 64位 ...

  3. Vue介绍和使用

    一.Vue介绍 - Vue是一套构建用户界面的渐进式前端框架.- 只关注视图层,并且非常容易学习,还可以很方便的与其它库或已有项目整合.- 通过尽可能简单的API来实现响应数据的绑定和组合的视图组件. ...

  4. CF452C 题解

    洛谷链接&CF 链接 题目简述 有 \(m \times n\) 张牌,有 \(n\) 个种类,每个种类有 \(m\) 张,现在抽一张放回,再抽一张,求这张牌与第一张抽出的牌种类相同的概率. ...

  5. 最新SEO自动外链蜘蛛池工具促进百度快速收录使用方法介绍

    此工具集成市面上所有自动外链网站的资源链接,经过合并.去重.筛选.验证 总结出最终的外链资源 ,软件实时更新 本软件将您繁杂的外链推广转为自动化进行,并且加入站群的支持,您只需要将你的站群域名粘贴到软 ...

  6. 【Java】 Void 类型

    void 也算一个类型,而且是基本数据类型 和其它数据类型一样提供了对应的包装类Void 每个包装类都提供一个TYPE字节实例,返回对应的原型类实例 public static void main(S ...

  7. 【C】Re08 内存

    一.概述 程序运行之后,所有的数据加载到内存上 内存会被操作系统进行分区处理, 划分的区域主要分为4个: [1.代码文本区 text] 存放开发者编写的代码文本,二进制内容形式 [2.静态全局区 St ...

  8. python性能分析器:line_profiler

    代码: import line_profiler import sys def test(): for i in range(0, 10): print( i**2 ) print("End ...

  9. 最为期待的国产3D游戏 —— 3A大作 ——《黑神话:悟空》

    地址: https://www.heishenhua.com/

  10. 为什么是Google创造了AlphaGo,而不是其他公司?

    相关: Artificial Intelligence | 60 Minutes Full Episodes 答案: Google一直在进行AI方向的探索: Google有足够的算力.